Java 在 Ruby 中的 SecretKeySpec?
Java's SecretKeySpec in Ruby?
我正在尝试将一些 Java
代码移植到 Ruby
。我得到了一个 class,它在 Java
的 crypto
包 (javax.crypto.*
) 中使用了几个 classes,以便 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();
}
同样,我可以在 Ruby
中完成大部分工作,但我缺少的是 SecretKeySpec。 Ruby
中是否有等价物?
我在 Ruby 中的代码看起来像 this。区别在于我更新的 Cipher
是 blowfish
而不是 bf-ecb
OpenSSL::Cipher.new('blowfish').encrypt
我也设置了自己的 key_length
因为我应该使用的密钥是 14 个字符。
Java 代码似乎首先对密钥进行十六进制解码。 SecretKeySpec
只是密钥(随机或伪随机)字节的包装器。
因此您首先需要解码十六进制字符串,然后将其用作密钥:
cipher = OpenSSL::Cipher.new('blowfish-xxx-ecb')
cipher.encrypt
cipher.key = [sKey].pack('H*')
return cipher.update(var1) + decipher.final
其中 xxx 是解码密钥的大小位。
我正在尝试将一些 Java
代码移植到 Ruby
。我得到了一个 class,它在 Java
的 crypto
包 (javax.crypto.*
) 中使用了几个 classes,以便 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();
}
同样,我可以在 Ruby
中完成大部分工作,但我缺少的是 SecretKeySpec。 Ruby
中是否有等价物?
我在 Ruby 中的代码看起来像 this。区别在于我更新的 Cipher
是 blowfish
而不是 bf-ecb
OpenSSL::Cipher.new('blowfish').encrypt
我也设置了自己的 key_length
因为我应该使用的密钥是 14 个字符。
Java 代码似乎首先对密钥进行十六进制解码。 SecretKeySpec
只是密钥(随机或伪随机)字节的包装器。
因此您首先需要解码十六进制字符串,然后将其用作密钥:
cipher = OpenSSL::Cipher.new('blowfish-xxx-ecb')
cipher.encrypt
cipher.key = [sKey].pack('H*')
return cipher.update(var1) + decipher.final
其中 xxx 是解码密钥的大小位。