Java Crypto API等效于Ruby的OpenSSL(通过encrypted_strings库)

时间:2012-03-18 14:51:42

标签: java ruby cryptography openssl

我正在尝试解密使用encrypted_strings RubyGem库在Ruby Web应用程序中加密的加密邮件。

加密客户端代码如下所示:

cipher = EncryptedStrings::SymmetricCipher.new(:passphrase => "abcdefgh"*2)
cipher.encrypt("howdy")
=> "jEUQrH58Ulk=\n" 

默认的对称密码算法似乎是DES-EDE3-CBC(虽然RubyGem的文档不同意,但我会按照代码所说的去做)。所以在Java方面我尝试了以下在线发现的以下作为DES-EDE3-CBC使用Java Cryptography API的例子:

import javax.crypto.spec.DESedeKeySpec
import javax.crypto.spec.IvParameterSpec
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory


...
DESedeKeySpec k;
Cipher c;

...
k = new DESedeKeySpec("abcdefghabcdefgh".getBytes());
c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, k);
decrypted = c.doFinal("jEUQrH58Ulk=\n".getBytes());

当我在Java端执行此操作时,我得到以下内容:

Wrong key size 

我还尝试使用带有初始化向量的Java Crypto API但不知道我应该将字节设置为什么,因为我没有在Ruby端通过encrypted_strings库执行此操作,并且它似乎在C中设置代码与OpenSSL连接。

任何指针都会非常感激。

我正在使用充气城堡JCA提供商。我还尝试了DES / ECB / PKCS5Padding(这与RubyGems文档中记录的默认算法相对应,尽管代码似乎引用了前面提到的算法DES-EDE3-CBC)。

我试过阅读Java加密API,但文档似乎都有相同的代码示例,并没有很多新的线索。我的消息来源包括:

1 个答案:

答案 0 :(得分:0)

我会把它作为答案发布。使用DESede,您可以使用192位DES ABC密钥或128位ABA密钥。许多Java版本只接受192位(24字节)DES ABC密钥。 DES ABA密钥是加密,解密,加密(EDE)操作的第一个和最后一个密钥相同的地方;换句话说,它与ABC的DESede相同,其中C = A.

因此,要创建这样一个密钥,您可以复制密钥的前8个字节(在您的情况下为8个ASCII字符 - 直接使用字符作为密钥错误)并在最后将它们连接起来。这将导致"abcdefghabcdefghabcdefgh".getBytes("ASCII")。请注意,您应始终指明字符编码,因为平台也可能使用UTF-16作为默认字符编码,从而导致密钥的大小加倍。