2017-10-04 1 views
2

J'utilise ActiveSupport :: MessageEncryptor pour chiffrer une chaîne en Ruby comme suit:Impossible de déchiffrer la chaîne cryptée Ruby à Scala

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" 

Puis à Scala j'essaie de déchiffrer comme ceci:

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")) 

Mais je lance dans cette erreur:

javax.crypto.IllegalBlockSizeException: longueur d'entrée doit être un multiple de 16 avec chiffrement lors du déchiffrement rembourré

+0

Essayez de le chiffrer avec Scala et vous obtiendrez le même résultat. xD –

+0

Cela ne marchera pas je pense .... ruby ​​utilise un iv aléatoire qui est ajouté à la chaîne cryptée – Daniel

Répondre

0

Je pense que le problème pourrait être ici:

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

La deuxième partie de votre message est 1ede80eb2b498ddf5133f8f3a45a82db2476c740 qui n'est pas une base 64 chaîne codée, il est une chaîne codée hexagonale. Essayez ceci à la place:

Hex.decodeHex(parts(1))