Эквивалент AES в Ruby openssl?

Библиотека Gibberish предоставляет хороший алгоритм CBC...

// In Jascascript
GibberishAES.enc("Made with Gibberish\n", "password");
// Outputs: "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o"

# On the command line
echo "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o" | 
  openssl enc -d -aes-256-cbc -a -k password

Как я могу сделать эту расшифровку в ruby? Прямой путь не работает...

require 'openssl'

def aes(m,k,t)
  (aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').send(m)).key = k
  aes.update(t) << aes.final
end

def encrypt(key, text)
  aes(:encrypt, key, text)
end

def decrypt(key, text)
  aes(:decrypt, key, text)
end

def p k
  Digest::SHA256.digest(k) ## what goes here???
end

require 'base64'
def t x
  ## also tried.. simply returning x...
  Base64.decode64(x)      
end


text = "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o"
pass = "password"

decrypt(p(pass), t(text))

person Ryan Oberoi    schedule 21.12.2009    source источник
comment
iv не устанавливается... каково его значение по умолчанию? Я решил это в прошлом. опять натыкаюсь на это... ааааа...   -  person Ryan Oberoi    schedule 21.12.2009


Ответы (2)


Копание в коде тарабарщины... дает подсказки к ответам. и почему традиционный механизм не работает.

dec = function(string, pass) {
    // string, password in plaintext
    var cryptArr = Base64.decode(string),
    salt = cryptArr.slice(8, 16),
    pbe = openSSLKey(s2a(pass), salt),
    key = pbe.key,
    iv = pbe.iv;
    cryptArr = cryptArr.slice(16, cryptArr.length);
    // Take off the Salted__ffeeddcc
    string = rawDecrypt(cryptArr, key, iv);
    return string;
},

Преобразование в рубин теперь довольно тривиально ... записываю это для моей личной будущей ссылки.

require 'base64'
require 'openssl'

def decode(k,t)
  cryptArr = Base64.decode64(t)
  salt     = cryptArr[8..15]
  data     = cryptArr[16..-1] 

  aes = OpenSSL::Cipher::Cipher.new('AES-256-CBC').decrypt
  aes.pkcs5_keyivgen(k, salt, 1)
  s = aes.update(data) + aes.final
end

orig = "Made with Gibberish\n"
cipr = "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o"
pass = "password"

puts decode(pass, cipr)
person Ryan Oberoi    schedule 21.12.2009

Я написал оригинальную JS-библиотеку Gibberish и, наконец, дошел до исправления ситуации в Ruby. Приведенный выше код от Ryan Oberoi абсолютно правильный, но я пошел дальше и создал гем, чтобы делать то же самое. Проверьте это на https://github.com/mdp/gibberish.

person Mark Percival    schedule 05.04.2011