Я хочу обеспечить конфиденциальность сообщений между приложением Android и сервером C #ASP.NET в ситуации, когда HTTPS не может быть доступен.
Я хочу использовать RSA для шифрования симметричного ключа, который передается с устройства Android при первом контакте с сервером.
Пара ключей RSA была сгенерирована на сервере, и закрытый ключ хранится на сервере. Пара ключей была сгенерирована в C #с использованием:
// Create a new instance of RSACryptoServiceProvider
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
// Ensure that the key doesn't get persisted
rsa.PersistKeyInCsp = false;
RSAParameters parameters = rsa.ExportParameters(false);
string modulus = Convert.ToBase64String(parameters.Modulus);
string exponent = Convert.ToBase64String(parameters.Exponent);
string xmlKeys = rsa.ToXmlString(true);
Попытка внедрить открытый ключ путем жесткого -кодирования (копирования из Visual Studio в Eclipse )не работает. Код выдает входное значение org.bouncycastle.crypto.DataLengthException :, слишком большое для шифрования RSA при вызове метода rsaCipher.doFinal ().
// Generate a new AES key
byte[] key = null;
try {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);
key = keygen.generateKey().getEncoded();
}
catch (NoSuchAlgorithmException e) {}
// Set up modulus and exponent
String mod = "qgx5606ADkXRxndzurIRa5GDxzDYg5Xajeym7I8BXG1HBSzaaGmX+rjQfZK1h4JtQU+Xaowsc81mgJU8+gwneQa56r1bl6/5jFue4FsdXKfpau5az8rY2SAHKcOeyHAOsT9ZqcNa1x6cL/jl9P3cBtOzMk51Hk/w6VNoQ5JJo/0m/eAJzlhVKr2xbOYFhd0xp3qUgRuK8TN4TsSvfc+R1LOWc8+3H22Zj3vhBxSqSgeXxdxi7ThiGiAl6HUwMf8ph7FHNJvoUQq+QPL6dx77pu6xVFiHv1JOfpbKcOubn0VSPLYKY3QPKCzNMYQ6pxUDqzpGtydHR1xaX5K0FGTraw==";
String ex = "AQAB";
BigInteger modulus = new BigInteger(Base64.decode(mod, Base64.DEFAULT));
BigInteger exponent = new BigInteger(Base64.decode(ex, Base64.DEFAULT));
// Encrypt the AES key
PublicKey pubKey;
byte[] cipherData;
try {
pubKey = KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpe(modulus, exponent));
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsaCipher.init(Cipher.ENCRYPT_MODE, pubKey);
// The following line fails with:
// org.bouncycastle.crypto.DataLengthException
cipherData = rsaCipher.doFinal(key);
}
catch (InvalidKeySpecException e) {}
catch (NoSuchAlgorithmException e) {}
catch (InvalidKeyException e) {}
catch (NoSuchPaddingException e) {}
catch (BadPaddingException e) {}
catch (IllegalBlockSizeException e) {}
Я подозреваю, что неправильно расшифровал строку модуля, потому что генерация открытого ключа в Android успешно шифрует ключ. Я использовал этот код:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kpa = kpg.genKeyPair();
pubKey = kpa.getPublic();
Итак, что я сделал не так?