繁体   English   中英

红宝石到Android 3DES加密-填充块损坏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM