Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在Scala中解密Ruby加密的字符串_Ruby_Scala_Encryption - Fatal编程技术网

Can';t在Scala中解密Ruby加密的字符串

Can';t在Scala中解密Ruby加密的字符串,ruby,scala,encryption,Ruby,Scala,Encryption,我使用ActiveSupport::MessageEncryptor在Ruby中加密字符串,如下所示: salt = SecureRandom.random_bytes(64) // => "s\x90L\xB8\xEF\x8BBp\xB6\xF5A\x95\xA8]+\x94\xF3\xA7\x9A\x84+jC\xBF\xB0\x15\xEF*\x8C\xDD.\xE5\xC7Y\xCE\xE1\xAA\xA4I/%.\x9E\x14\xC1\xA8\x9E\x122\xE0\x19.

我使用ActiveSupport::MessageEncryptor在Ruby中加密字符串,如下所示:

salt = SecureRandom.random_bytes(64)
// => "s\x90L\xB8\xEF\x8BBp\xB6\xF5A\x95\xA8]+\x94\xF3\xA7\x9A\x84+jC\xBF\xB0\x15\xEF*\x8C\xDD.\xE5\xC7Y\xCE\xE1\xAA\xA4I/%.\x9E\x14\xC1\xA8\x9E\x122\xE0\x19.\x19\xD8\xB6\xE8\x83\xE1\xFE\x16\xB5\x11N\x18"

key = ActiveSupport::KeyGenerator.new('password').generate_key(salt)
// => "\x12\xBD1\xA0Q\xBF)\\\x89\xDF\x95\xD0\f\x03\x17P'\x87\xAD\x92b\xB5%\xC7X\x01\x9Ar\xCB\xC9\x1A\x10'\xC4\x95w\xBF\xED]\x17\xEB\x9F#\xC6\xEE8S\xE1^\x18\xE2^\x85Z\rJ\x9A\xEE\xA5\xEC|\xA2\xA9\x8E"

crypt = ActiveSupport::MessageEncryptor.new(key)
encrypted_username = crypt.encrypt_and_sign("daniel")
// => "N0dHcFM3MnQrcW1HUk9UTGwxeUJsZmlCNzcwUGhrdUdtbE9YWnUxamZFST0tLUVUcUlIU2k1ZHIvTmlDRUgzM2FsS0E9PQ==--1ede80eb2b498ddf5133f8f3a45a82db2476c740"
然后在Scala中,我尝试这样解密:

var encrypted_str = "N0dHcFM3MnQrcW1HUk9UTGwxeUJsZmlCNzcwUGhrdUdtbE9YWnUxamZFST0tLUVUcUlIU2k1ZHIvTmlDRUgzM2FsS0E9PQ==--1ede80eb2b498ddf5133f8f3a45a82db2476c740"

val parts = encrypted_str.split("--");

val encryptedData = Base64.decodeBase64(parts(0))

val iv = Base64.decodeBase64(parts(1))

val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv.take(16)));

val result = cipher.doFinal(encryptedData);
println(new String(result, "UTF-8"))
但我遇到了这个错误:


javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是16的倍数

val iv = Base64.decodeBase64(parts(1))
消息的第二部分是
1ede80eb2b498ddf5133f8f3a45a82db2476c740
,它不是base 64编码字符串,而是十六进制编码字符串。请尝试以下方法:

Hex.decodeHex(parts(1))

试着用Scala包住它,看看会不会得到同样的结果。我想这行不通……ruby使用一个随机iv,它被附加到加密字符串中