我正在尝试将一些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个字符。
答案 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是解码密钥的位。