2015-11-19 86 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);