问题
I am trying to implement asymmetric algorithm in Android. I have managed to do it all. But I am facing an issue while output.
What I am getting after decrypting through private key is(Which contains actual text in the end):
�������\�C���gz�{ܳkK��c��LB(7fz���H�8�� ��ȏ�ҍ�X ��KI��aj�B��x�D�n>�ι�&
UL-1���E�;��s9�zB[�9B�t��B�A�s�GA6����y�f���J�����+.
`g4�s�1��p�PW�%��7�"��fQ����G���x� �|&�ѡ�gq������:X�be�_��av��{'msg':'Laravel 7.7777777'}
Actual message is :
{'msg':'Laravel 7.7777777'}
You can clearly see it is present in the decrypted String. I know it is due to some string or some other silly mistake or something like that. But I am unable to get that. Even my encrypted data also have the same issue when it reaches to server. But when I am encrypting and decrypting in my end it works fine. It happens when key is interchanged.
Here, I am attaching my actual class which is responsible for Asymmetric encryption. With public and private key. Along with the encrypted text to be decrypted.
public class AsymmetricHandler {
String ALGO_TYPE = "RSA";
String CIPER_TYPE = "RSA";
// String CIPER_TYPE = "RSA/ECB/OAEPWithSHA-1AndMGF1Padding";
private static AsymmetricHandler instance = null;
public static AsymmetricHandler getInstance() {
if (instance == null) {
Security.setProperty("crypto.policy", "unlimited");
instance = new AsymmetricHandler();
}
return instance;
}
public PublicKey getActualPublicKey(String base64EncryptedStringKey) throws Exception {
KeyFactory kf = KeyFactory.getInstance(ALGO_TYPE);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.decode(base64EncryptedStringKey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", ""), Base64.DEFAULT));
return kf.generatePublic(keySpecX509);
}
public PrivateKey getActualPrivateKey(String base64EncryptedStringKey) throws Exception {
KeyFactory kf = KeyFactory.getInstance(ALGO_TYPE);
PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(base64EncryptedStringKey.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", ""), Base64.DEFAULT));
return kf.generatePrivate(keySpecPKCS8);
}
public String decodeBase64String(String value) {
return new String(Base64.decode(value, Base64.DEFAULT));
}
public String encodeToBase64String(String value) {
return new String(Base64.encode(value.getBytes(), Base64.DEFAULT));
}
// Get RSA keys. Uses key size of 2048.
public Map<String, Object> getRSAKeys() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGO_TYPE);
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
Map<String, Object> keys = new HashMap<String, Object>();
keys.put("private", privateKey);
keys.put("public", publicKey);
return keys;
}
public String encryptString(String msg, PublicKey key)
throws NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException,
BadPaddingException, InvalidKeyException {
// Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
Cipher cipher = Cipher.getInstance(CIPER_TYPE);
cipher.init(Cipher.ENCRYPT_MODE, key);
return Base64.encodeToString(cipher.doFinal(msg.getBytes(StandardCharsets.UTF_8)), Base64.DEFAULT);
}
public String decryptString(String msg, PrivateKey key)
throws InvalidKeyException,
IllegalBlockSizeException, BadPaddingException {
try {
// Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
Cipher cipher = Cipher.getInstance(CIPER_TYPE);
cipher.init(Cipher.DECRYPT_MODE, key);
return new String(cipher.doFinal(Base64.decode(msg, Base64.DEFAULT)), StandardCharsets.UTF_8);
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
return null;
}
}
Here are sample key and value which I am using.
String stringPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApSNOjR5QWU4H24OAhPHaJwq7/9Nqzcfiiau4o51+yopr9RG2ZDjpoeP/DEL/Frnz+PRrcdwiZxtk00qVqz15Y/eOc3VsOGHYbPYI6Q27n4L/t1PRHw/9AWjWHomxNvSpxkgg3ABFUdfYVoPDYqbm9Vu1m50sHzqEGBX9xIdgYjlWrjsKmQD5ciejE+eYOJnXJPKG9oXZJGmiQRgvlaPYL6oj+jfbv5/+FHVgWRqXRXURLSxa85qPVS673hmi6ApqUCnWWNhuZ66S1SypvHnCFQuqLIDILGwMkRvm+SOXJKrtpRdENuQMfdBZjeILYHAgILYgTcCnmnhii35BMJ6kEQIDAQAB";
String stringPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClI06NHlBZTgfbg4CE8donCrv/02rNx+KJq7ijnX7Kimv1EbZkOOmh4/8MQv8WufP49Gtx3CJnG2TTSpWrPXlj945zdWw4Ydhs9gjpDbufgv+3U9EfD/0BaNYeibE29KnGSCDcAEVR19hWg8Nipub1W7WbnSwfOoQYFf3Eh2BiOVauOwqZAPlyJ6MT55g4mdck8ob2hdkkaaJBGC+Vo9gvqiP6N9u/n/4UdWBZGpdFdREtLFrzmo9VLrveGaLoCmpQKdZY2G5nrpLVLKm8ecIVC6osgMgsbAyRG+b5I5ckqu2lF0Q25Ax90FmN4gtgcCAgtiBNwKeaeGKLfkEwnqQRAgMBAAECggEAewKL1s7H514auEeCioVljUOPuwcPPe4xL3/879O3yMPHmyvwg0NptTASol2dip5FwCLBjnT+I3PibQnX51DJhc+4CwVi8bTg9HlpNcEHC9EXDsaetdbBDjW7mc/TdC5X8N11rKt+93IjMn7AIlJVJFuGMj6nyTNbhl2LRMPa5g67+FlXbAu4YTK5FuR1P8AKAyjECmiw0dov8FNHtmrQhcsAdB4I8EHNzyFnDmA9ecsnSQGw05p82JC11r6UlpI3zvcHwX9XtfzphbEW0rQ3eVzek4p9Nvi0z1wvOuHHqNYGlOGePX3tH0TY7+g41TZZwZEEUnH79ySd/nnorYdwAQKBgQD57s/ICRcZp9eKtdyGvKh2TBM1URt47l4cHNAJU+SoSAokAUZDtaWSvvpQmSSHL2CvkY6nbH95IlgHvQphW2sjGQNhEBnbaZJ9p+JfJ+nvRrKR8kc9ZsR9TpAatKIA/0vl2dnX7ugYUk4Hz2aIAIDfCA74oEz1PoBhzel92ZOTgQKBgQCpJYsqXqVP9DTV5Zd4M69LijVwhub8rYH/LiezFyReqtQ1IUG8triYveRpbu9h/zEPZGGl8xfapH+u4KanI8/glbR+Ef3cz2oFaQ7Hs9TVSI04UYCdZsf1PojTpUCJmWPxHT55855Nxclny9aIuf+vDV/WbiqH3eE3ljMNKDQYkQKBgBIdWvX2orP7VEX7dGZXmiYo0WOV41XagPusou9qIzKHNiTx6rPRoJSIPwBEeT9LEcjn1d0QohSXhqXY772qsJM0pugMELO0bSeqWV/oNq5fA2ZMlxk+L5OddBhbazqDRm78YSujZzMMFBfA0n+c+bowjVU72RgVVZzBHeE/OdEBAoGATQh7K8207gfi9DM+25B2WinUkq3tjtAabzP/ApIcjzyvro652I9C3NVGrDnIrdHB7yehTSm8CGh4ehV38JDfwIGNlQjum9yehV5GS+77lDMZlbeQop7HnEphmDoffUsteAcAiBvKUdMtGad8ygIjjv7BUfAUUJJdWqp+D5TqvPECgYEAtLfIbEy3vwYpLYAKZiTQPwuy18UNV6vOPnyLwJ3d/LQ0slnbfO6gL1nS8gnzEGLtN/MRwYjJsUW5F2gzcnLPPmOTiuGFt0d3TqMTnnPaAtmR2Y1vxfwrdf8xtyJfDgtM59mCPjnJNQIinD4Nn/AMhsUC3AfejkeJfOEyYXvnO/k=";
String encryptedText = "OqY8zdB44msKeJ8ysu6HwO/LcwldWly6rTsd3GSxjZ2U9ncSVGjEVaWNeaYROHMJY3YmJMpFQ0bwDUUnWDjOqjNU15O2gKH6N+l4BD2jiYhcSXSgGFPLvQrS+Fb865/Y9f/U9Jqi7zBZtTEXuktIrcCb8Drr3aaT8q3yHEWPCfBBzxtffm60WHU0k1hM6EtZiXufCjD3q4ILEzs/+IOnoZ8njCIc15DD/YN9fBRIifw+zy+EFpCWLlzDeejR2wwqVyENQSmfiChC4EVnULqfHfeSWOqK/QVATYC6ljkr+G4QQQ82VQ8sRGS6x40ClKINTerqKxhSpwNoNuaDqmBkHw=="
回答1:
Your mistake is that you are using plain RSA
without padding when decrypting your encrypted data.
When encrypting data with RSA the data size has to be of a certain length. If the data to be encrypted is too short it has to enlarged to the correct size by prepending padding bytes (which is obviously done by the code that encrypts the data).
The problem is not that you are decrypting the data without padding and hence you are getting the padding data plus the decrypted message.
Therefore make sure to use for encryption and decryption the same padding algorithm. Your code already specifies OAEPWithSHA-1AndMGF1Padding
as padding but the relevant parts are commented out.
Use RSA/ECB/OAEPWithSHA-1AndMGF1Padding
for encryption and decryption and the padding data will be automatically removed upon decryption.
来源:https://stackoverflow.com/questions/61256128/unknown-characters-at-starting-while-parsing-from-private-key-in-asymmetric-algo