Я разрабатываю приложение чата 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 не обновляется, а сообщения шифруются, а затем происходит сбой приложения.
Может кто-нибудь помочь выяснить как это решить!