[英]ruby to android 3DES encryption - pad block corrupted
我正在尝试在ruby中加密字符串,并在Android中解密。 我不太熟悉加密技术,但是我已经阅读了一些书,而且我想快要开始工作了。 但是,在Android方面仍然出现错误,我只是不知道如何解决。 我了解填充是什么,并且它是不正确的,但是我需要更改什么才能使其工作? 我的Ruby和Java代码如下。 谢谢!!!
红宝石:
shared_key = "123456789012345678901234"
cipher = OpenSSL::Cipher::Cipher.new("des3")
cipher.encrypt
cipher.key = shared_key
ciphertext = cipher.update(secret)
ciphertext << cipher.final
Rails.logger.debug(ciphertext);
encrypted_secret = Base64.encode64(ciphertext)
Rails.logger.debug(encrypted_secret);
render json: { 'token' => token, 'secret' => encrypted_secret }, status: :ok
Java的:
SecretKey key = new SecretKeySpec(SHARED_DECRYPTION_KEY.getBytes("UTF8"), "DESede");
byte[] encryptedSecretBytes = Base64.decode(secret);
Cipher cipher = Cipher.getInstance("DESede"); // cipher is not thread safe
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainTextSecretBytes = (cipher.doFinal(encryptedSecretBytes));
String decryptedSecret = Base64.encodeBytes(plainTextSecretBytes);
和我在Android中得到的例外:
05-14 19:03:11.500: W/System.err(22175): javax.crypto.BadPaddingException: pad block corrupted
05-14 19:03:11.500: W/System.err(22175): at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:709)
05-14 19:03:11.500: W/System.err(22175): at javax.crypto.Cipher.doFinal(Cipher.java:1111)
05-14 19:03:11.500: W/System.err(22175): at com.cdlcollege.saas.Credentials.storeServerAccessCredentials(Credentials.java:85)
填充块损坏意味着使用了错误的密钥解密,或者在加密和解密之间更改了数据。
如果我不得不猜测,我怀疑您是在以错误的方式创建密钥。 我猜您应该已经进行了十六进制转换,而不是调用getBytes()
。
请参阅将十六进制字符串转换为字节[]以获取执行此任务的示例Android代码。
旁注:不要仅为密码指定"DESede"
。 同时指定模式和填充。 例如"DESede/CBC/PKCS5Padding"
。 这样可以确保您获得所需的确切信息,而不是加密提供程序的默认设置(具体情况视手机而定)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.