perl CBC DES相当于java

我们正在将一些代码从perl迁移到java / scala,我们遇到了障碍。

我们试图弄清楚如何在Java / scala中执行此操作:

use Crypt::CBC; $aesKey = "some key" $cipher = new Crypt::CBC($aesKey, "DES"); $encrypted = $cipher->encrypt("hello world"); print $encrypted // prints: Salted__ ,% 8XL /1 & n;    쀍c $decrypted = $cipher->decrypt($encrypted); print $decrypted // prints: hello world 

我在scala中尝试了一些东西但是并没有真正做到正确,例如:

  val secretKey = new SecretKeySpec("some key".getBytes("UTF-8"), "DES") val encipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); encipher.init(Cipher.ENCRYPT_MODE, secretKey) val encrypted = encipher.doFinal(bytes) println("BYTES:" + bytes) println("ENCRYPTED!!!!!!: " + encrypted) println(toString(encrypted)) 

Java / scala中的任何帮助或指导都将非常受欢迎

假设Crypt模块是我在https://metacpan.org/pod/Crypt::CBC中找到的模块,它默认记录为(相同)openssl,显然意味着命令行’enc’(openssl库有很多其他选项)。 这不是直接使用指定密钥(和IV)进行加密,而是使用密钥进行加密(PBE),密钥和IV来自指定的’密钥’(真正的密码)加上(传输)盐,使用扭曲在原始(现在未经推荐的)PKCS#5 v1.5算法上,重新激活了PBKDF1。 请参阅http://www.openssl.org/docs/crypto/EVP_BytesToKey.html (或安装了openssl的Unix系统上的手册页)和rfc2898(或现在位于EMC的原始RSA Labs PKCS文档)。

你说你不能改变perl发送者。 我希望用户/所有者/无论谁认识到原始的DES,为了清晰起见而重复单一DES,已经十多年来实际上是暴力的,PBE-1DES甚至可能更弱; openssl twist不会像PKCS#5(KDF1和KDF​​2)那样迭代。

Java(使用Suncle提供程序)确实实现了PBEWithMD5AndDES,它使用PBEParameterSpec(salt,1)启动,成功解密来自’openssl enc -des-cbc’的数据,因此我也期望你的perl发送者(未经过测试)。 FWIW如果你可以改为三重DES,Java使用PBKDF1的明显非标准扩展(超出散列大小)实现PBEWithMD5AndTripleDES,这与openssl的非标准扩展完全不同,因此如果perl模块实际上遵循openssl则不兼容。 您必须自己进行密钥推导,然后引导3DES-CBC-pad,这不是很难。

另请注意,任何现代计算机算法的加密数据都是二进制 如果您尝试再次使用它,“打印”它就好像它是perl,Java或几乎任何其他文本一样,可能会导致数据损坏。 如果你只是想看到’根本没有任何输出,并且它明显不是明文’你就可以了。