2009-12-21 1 views
6

Gibberish библиотека обеспечивает хороший CBC Algo ...AES эквивалент в Ruby openssl?

// 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)) 
+0

iv не получает установленный ... что его значение по умолчанию? Я решил это в прошлом. спотыкаясь об этом снова ... aaargh ... –

ответ

4

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

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

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