2014-05-15 39 views
1

我想加密红宝石中的字符串和Android中的解密。我对加密很不熟悉,但是我已经做了一些阅读,我想我已经接近工作了。然而,我仍然遇到了Android方面的错误,我只是不明白如何解决。我知道填充是什么,它是不正确的,但我需要改变以做出这项工作?下面是我的ruby和java代码。谢谢!!!红宝石到Android 3DES加密 - 垫块损坏

红宝石:

shared_key = "123456789"  
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) 

回答

0

垫块损坏指错了钥匙被用于解密或数据在加密和解密之间被改变。

如果我不得不猜测,我怀疑你是以错误的方式创建一个密钥。我猜你应该完成十六进制转换,而不是调用getBytes()

查看Convert hex string to byte []例如用于执行此任务的Android代码。


附注:不要只指定"DESede"作为密码。指定模式和填充。例如。 "DESede/CBC/PKCS5Padding"。这可以确保你得到你想要的,而不是加密提供商的默认值(这可能会因手机而异)。

+0

好有趣我会检查这些,看看它让我。感谢指针。 – deepwinter

+0

感谢您的帮助,它绝对让我走上正轨。我也发现这个问题:http://stackoverflow.com/questions/11266556/encrypt-in-ruby-and-decrypt-in-java-why-is-it-not-working接近重复,并包含一些帮助我使用AES加密的代码。 – deepwinter

+0

@deepwinter问题的根源是什么? –