Генерация ключей RSA - PullRequest
       15

Генерация ключей RSA

0 голосов
/ 25 апреля 2020

Я разрабатываю приложение чата android для моего дипломного проекта, который должен использовать криптографию для защиты сообщений. Для этого я использую сквозное шифрование, реализующее алгоритм RSA, так что это мой класс:

public class RSA {
byte[] encryptedBytes, decryptedBytes;
Cipher cipherE, cipherD;
String  encrypted,decrypted;
public String Encryption(String plainText, String publicKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

    byte[] publicByte = Base64.decode(publicKeyString,Base64.DEFAULT);
    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicByte);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PublicKey publicKey = keyFactory.generatePublic(keySpec);

    cipherE = Cipher.getInstance("RSA");
    cipherE.init(Cipher.ENCRYPT_MODE,publicKey);

    encryptedBytes = cipherE.doFinal(plainText.getBytes());
    encrypted = bytesToString(encryptedBytes);
    return encrypted;

}
public String Decryption (String cipherText, String privateKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
    byte[] privateBytes = Base64.decode(privateKeyString,Base64.DEFAULT);
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

    cipherD = Cipher.getInstance("RSA");
    cipherD.init(Cipher.DECRYPT_MODE, privateKey);

    decryptedBytes = cipherD.doFinal(stringToBytes(cipherText));
    decrypted = new String(decryptedBytes);
    return decrypted;
}

public  String bytesToString(byte[] b) {
    byte[] b2 = new byte[b.length + 1];
    b2[0] = 1;
    System.arraycopy(b, 0, b2, 1, b.length);
    return new BigInteger(b2).toString(36);
}

public  byte[] stringToBytes(String s) {
    byte[] b2 = new BigInteger(s, 36).toByteArray();
    return Arrays.copyOfRange(b2, 1, b2.length);
}}

Я генерирую свои ключи в своей деятельности по запуску, храня publi c и закрытые ключи в sharedpreference и сохранение ключа publi c в базе данных firebase, вот как я это делаю:

public void RSAKeys() throws NoSuchAlgorithmException{
    SharedPreferences sharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE);
    publicKeystring = sharedPreferences.getString("publicKey"+currentUser.getUid(),null);
    privateKeyString = sharedPreferences.getString("privateKey"+currentUser.getUid(),null);

    if(privateKeyString==null && publicKeystring==null) {
        keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);

        keyPair = keyPairGenerator.genKeyPair();
        publicKey = keyPair.getPublic();
        privateKey = keyPair.getPrivate();

        if (privateKey != null) {
            privateKeyString = Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT);
        }
        if (publicKey != null) {
            publicKeystring = Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT);

        }

        pubKeyRef.child(currentUser.getUid()).child("publicKey").setValue(publicKeystring).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
            SharedPreferences.Editor editor = getSharedPreferences(PREFS,MODE_PRIVATE).edit();
            editor.putString("publicKey"+currentUser.getUid(),publicKeystring);
            editor.putString("privateKey"+currentUser.getUid(),privateKeyString);
            editor.apply();
            }
        });
    }
}

Все работает нормально, сообщения шифруются и дешифруются просто хорошо, но я заметил, что когда я вхожу с тем же пользователем на другом устройстве, ключевой узел publi c в базе данных firebase не обновляется, а сообщения шифруются, а затем происходит сбой приложения.

Может кто-нибудь помочь выяснить как это решить!

...