2015-11-19 84 views
1

下面的Ruby代碼工作相當於Java Ruby的AES CBC解密

require 'openssl' 
require "base64" 

cipher = OpenSSL::Cipher::AES256.new(:CBC) 
cipher.decrypt 
cipher.key = Base64.strict_decode64("LLkRRMSAlD16lrfbRLdIELdj0U1+Uiap0ihQrRz7HSQ=")  
cipher.iv = Base64.strict_decode64("A23OFOSvsC4UyejA227d8g==") 
crypt = cipher.update(Base64.strict_decode64("D/e0UjAwBF+d8aVqZ0FpXA=="))  
crypt << cipher.final 
puts crypt # prints Test123 

而是試圖用相同的密鑰/ IV /密碼做同樣在Java,但它不返回 'Test123'

Security.addProvider(new BouncyCastleProvider()); 

    byte[] key = Base64.getDecoder().decode("LLkRRMSAlD16lrfbRLdIELdj0U1+Uiap0ihQrRz7HSQ="); 
    byte[] iv = Base64.getDecoder().decode("A23OFOSvsC4UyejA227d8g=="); 
    byte[] input = Base64.getDecoder().decode("D/e0UjAwBF+d8aVqZ0FpXA=="); 

    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv)); 
    byte[] output = cipher.doFinal(input); 
    System.out.println("[" + new String(output) + "] - "+output.length); 

爲了簡單起見,鍵和iv是硬編碼的

+1

'cipher.decrypt'做不翻譯爲'Cipher.ENCRYPT_MODE' – zapl

+0

@zapl。謝謝。傻我。 'AES/CBC/PKCS5Padding'領先空間被截斷 – yodhevauhe

回答

1

你說的是加密而不是解密。代碼校正線

cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv)); 

此外,如果你想使用BouncyCastle的這一點,使用

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", BouncyCastleProvider.PROVIDER_NAME); 

或使BouncyCastle的默認:

Security.insertProviderAt(new BouncyCastleProvider(), 1);