Ruby中的Java的SecretKeySpec?

时间:2015-10-27 20:02:25

标签: java ruby cryptography blowfish

我正在尝试将一些Java代码移植到Ruby。我获得了一个使用Java的{​​{1}}包(crypto)中的几个类的类,以便使用javax.crypto.* encrypt一个字符串。有几个部分我坚持,并希望得到一些帮助。

Blowfish

同样,我可以在public String encrypt(String var1) throws BlowfishCipher.BCException { try { byte[] var2 = var1.getBytes("UTF-8"); byte[] var3 = this.encrypt(var2); return bytesToHexString(var3); } catch (Exception var4) { if(var4 instanceof RuntimeException) { throw (RuntimeException)var4; } else if(var4 instanceof BlowfishCipher.BCException) { throw (BlowfishCipher.BCException)var4; } else { throw new BlowfishCipher.BCException(var4); } } } public byte[] encrypt(byte[] var1) throws BlowfishCipher.BCException { try { Cipher var2 = Cipher.getInstance("Blowfish"); byte[] var3 = hexStringToBytes(this.sKey); SecretKeySpec var4 = new SecretKeySpec(var3, "Blowfish"); var2.init(1, var4); return var2.doFinal(var1); } catch (Exception var5) { if(var5 instanceof RuntimeException) { throw (RuntimeException)var5; } else { throw new BlowfishCipher.BCException(var5); } } } private static String bytesToHexString(byte[] var0) { StringBuffer var1 = new StringBuffer(); for(int var2 = 0; var2 < var0.length; ++var2) { String var3 = Integer.toHexString(255 & var0[var2]); if(var3.length() < 2) { var1.append("0"); } var1.append(Integer.toHexString(255 & var0[var2])); } return var1.toString(); } 中完成大部分工作,但我缺少的是SecretKeySpec。 Ruby中有等价物吗?

我在Ruby中的代码看起来像this。不同之处在于Ruby我正在新手Cipher而不是blowfish

bf-ecb

我也设置了自己的OpenSSL::Cipher.new('blowfish').encrypt ,因为我应该使用的密钥是14个字符。

1 个答案:

答案 0 :(得分:2)

Java代码似乎首先对密钥进行十六进制解码。 SecretKeySpec只是密钥的(随机或伪随机)字节的包装。

因此,您首先需要解码十六进制字符串,然后将其用作密钥:

cipher = OpenSSL::Cipher.new('blowfish-xxx-ecb')
cipher.encrypt
cipher.key = [sKey].pack('H*')
return cipher.update(var1) + decipher.final

其中xxx是解码密钥的