perl CBC DES相当于java

时间:2014-02-27 19:39:17

标签: java aes des

我们正在将一些代码从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中的任何帮助或指导

1 个答案:

答案 0 :(得分:0)

假设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使用一个非标准的实现PBEWithMD5AndTripleDES PBKDF1的扩展(超出散列大小),这与openssl的非标准扩展完全不同,因此如果perl模块实际上遵循openssl则不兼容。 您必须自己进行密钥派生,然后引导3DES-CBC-pad,这不是很难。

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