/ / Ruby OpenSSL AES-128-CTR - ruby, openssl, criptografia, aes

Ruby OpenSSL AES-128-CTR - rubi, openssl, criptografia, aes

Eu não consigo descobrir o que estou fazendo de errado aqui tentando descriptografar uma seqüência de valores hexadecimais com uma determinada chave usando cifra OpenSSL de Ruby AES-128-CTR.

Estou usando a gema hex_string converter meu hex para bytes

ctrkey = "36f18357be4dbd77f050515c73fcf9f2"
ciphertext3 = "69dda8455c7dd4254bf353b773304eec0ec7702330098ce7f7520d1cbbb20fc3
88d1b0adb5054dbd7370849dbf0b88d393f252e764f1f5f7ad97ef79d59ce29f5f51eeca32eabedd9afa9329"

cipher2 = OpenSSL::Cipher.new("AES-128-CTR")
cipher2.decrypt

ctrkey = ctrkey.to_byte_string
cipher2.key = ctrkey

iv = cipher2.random_iv
cipher2.iv = iv

ciphertext3 = ciphertext3.to_byte_string
plain = cipher2.update(ciphertext3) + cipher2.final

puts "plaintext of Q3: #{plain}"

Eu sei que estou faltando alguma coisa pequena porque eu tenho código semelhante implementando AES-128-CBC. Preciso ter um contador que incremente o IV para cada bloco de 128 bytes no texto cifrado?

Respostas:

1 para resposta № 1

Não, você não está perdendo algo pequeno, você está perdendo algo enorme.

Em vez de usar o mesmo IV usado para criptografia, você está gerando um novo. Para o CTR, se o IV for aleatório, cada valor do contador será diferente, resultando em uma saída de aparência aleatória.

Muitas vezes, o IV (ou nonce no caso de CTR) é prefixado ao texto cifrado. Para CTR, pode haver menos bytes do que 16 - embora esse ainda seja o tamanho mais provável de ser testado.