2014-10-21 2 views
-4

Ниже мой Java-код для DES дешифрования:DES дешифрования в Рубине

public static byte[] decrypt(final byte[] value, final String key) throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException { 
    final DESKeySpec objDesKeySpec = new DESKeySpec(key.getBytes("UTF-8")); 
    final SecretKeyFactory objKeyFactory = SecretKeyFactory.getInstance("DES"); 
    final SecretKey objSecretKey = objKeyFactory.generateSecret(objDesKeySpec); 
    final byte[] rgbIV = key.getBytes(); 
    final IvParameterSpec iv = new IvParameterSpec(rgbIV); 
    final Cipher objCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
    objCipher.init(2, objSecretKey, iv); 
    return objCipher.doFinal(value); 
} 

И я стараюсь, чтобы преобразовать его в Ruby-кода в следующем:

def decryption(key, decodeString) 
    ALG = 'des' 
    cipher = OpenSSL::Cipher::Cipher.new(ALG) 
    cipher.decrypt #choose descryption mode. 
    cipher.key = key 
    plain = cipher.update(decodeString) 
    plain << cipher.final 
end 

После выполнения Java и рубин кода, я получил одинаковый размер байтов, но содержимое байтов отличается. Где я неправ?

+2

Вы должны попытаться найти соответствующие ключевые слова и попытаться выполнить свою собственную реализацию, прежде чем искать решение на SO. –

+1

Stack Overflow не является сервисом преобразования кода. Вместо этого вам нужно попытаться найти решение, и когда вы столкнетесь с проблемами, задайте вопрос. –

+0

Возможный дубликат [Как выполнить вычисления Triple DES в Ruby в шестнадцатеричном формате?] (Http://stackoverflow.com/questions/3149288/how-to-perform-triple-des-calculations-in-ruby-in-hexadecimal) – Alexander

ответ

1

Спасибо за ваш вопрос!

Для этого используйте библиотеку OpenSSL :: Cipher. Вот ссылка с некоторым примером кода для AES: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/Cipher.html#class-OpenSSL::Cipher-label-Encrypting+and+decrypting+some+data

Чтобы использовать DES, запустите эту команду, чтобы проверить, поддерживает ли ваша установка Ruby DES.

puts OpenSSL::Cipher.ciphers 
+0

Спасибо. Если я использую шифрование и дешифрование в рубине, он отлично работает. И если шифрование и дешифрование как в Java, но и поиск работы. Но если шифрование в Java и дешифрование в Ruby, я получаю разный результат от дешифрования на Java, как я упоминал в вышеприведенном вопросе. –

+0

Вы пытались выяснить, как установить значения прокладки и значения IV? и что эти части алгоритма одинаковы между реализацией Java и Ruby? В правильном выполнении криптографии много движущихся частей, многие библиотеки используют несколько разные реализации. Я не знаком с ними в Ruby. – Barett

+0

Привет Баррет, я решил эту проблему, проверив статью ниже. Благодарим за ваше предложение. Это действительно помогает. –

2

Согласно этой статье: http://43n141e.blogspot.tw/2008/08/des-encryption-java-to-openssl-to-ruby.html, я пытаюсь следующие два шага: 1. Вычислить значение в.в. в Java:

String key = "123456" 
final byte[] rgbIV = key.getBytes(); 
final IvParameterSpec iv = new IvParameterSpec(rgbIV); 
byte[] ivBytes = iv.getIV(); 
StringBuffer sbuf = new StringBuffer(); 
for (byte b : ivBytes) { 
    sbuf.append(String.format("%02x", (b & 0xFF))); 
} 
System.out.println("iv: " + sbuf); 

2. расшифровывать в Ruby:

def decode(encryptedString, key, iv) 
    decrypt = OpenSSL::Cipher::Cipher.new('des-cbc') 
    decrypt.decrypt 
    decrypt.key = key 
    decrypt.iv = iv.scan(/../).map{|b|b.hex}.pack('c*') 
    decrypt.update(encryptedString) + decrypt.final 
end 

и это работает!

Смежные вопросы