Java 在 Ruby 中的 SecretKeySpec?

Java's SecretKeySpec in Ruby?

我正在尝试将一些 Java 代码移植到 Ruby。我得到了一个 class,它在 Javacrypto 包 (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。区别在于我更新的 Cipherblowfish 而不是 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 是解码密钥的大小