java aes opensll_如何使用java解码用openssl aes-128-cbc编码的字...

该博客介绍了如何使用Java和Bouncy Castle库解码由OpenSSL AES-128-CBC加密的字节。通过创建`OpenSSLAesDecrypter`类,它从加密数据中提取盐,然后使用OpenSSLPBEParametersGenerator生成密钥和初始化向量。代码提供了一个完整的示例,展示了如何使用特定密码解码加密字符串。
摘要由CSDN通过智能技术生成

使用Bouncy Castle库解决了它.

这是代码:

package example;

import java.util.Arrays;

import org.apache.commons.codec.binary.Base64;

import org.bouncycastle.crypto.BufferedBlockCipher;

import org.bouncycastle.crypto.CipherParameters;

import org.bouncycastle.crypto.InvalidCipherTextException;

import org.bouncycastle.crypto.engines.AESEngine;

import org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator;

import org.bouncycastle.crypto.modes.CBCBlockCipher;

import org.bouncycastle.crypto.paddings.BlockCipherPadding;

import org.bouncycastle.crypto.paddings.PKCS7Padding;

import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;

public class OpenSSLAesDecrypter

{

private static final int AES_NIVBITS = 128; // CBC Initialization Vector (same as cipher block size) [16 bytes]

private final int keyLenBits;

public OpenSSLAesDecrypter(int nKeyBits)

{

this.keyLenBits = nKeyBits;

}

public byte[] decipher(byte[] pwd, byte[] src)

{

// openssl non-standard extension: salt embedded at start of encrypted file

byte[] salt = Arrays.copyOfRange(src, 8, 16); // 0..7 is "SALTED__", 8..15 is the salt

try

{

// Encryption algorithm. Note that the "strength" (bitsize) is controlled by the key object that is used.

// Note that PKCS5 padding and PKCS7 padding are identical.

BlockCipherPadding padding = new PKCS7Padding();

BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), padding);

CipherParameters params = getCipherParameters(pwd, salt);

cipher.reset();

cipher.init(false, params);

int buflen = cipher.getOutputSize(src.length - 16);

byte[] workingBuffer = new byte[buflen];

int len = cipher.processBytes(src, 16, src.length - 16, workingBuffer, 0);

len += cipher.doFinal(workingBuffer, len);

// Note that getOutputSize returns a number which includes space for "padding" bytes to be stored in.

// However we don't want these padding bytes; the "len" variable contains the length of the *real* data

// (which is always less than the return value of getOutputSize.

byte[] bytesDec = new byte[len];

System.arraycopy(workingBuffer, 0, bytesDec, 0, len);

return bytesDec;

}

catch (InvalidCipherTextException e)

{

System.err.println("Error: Decryption failed");

return null;

}

catch (RuntimeException e)

{

System.err.println("Error: Decryption failed");

return null;

}

}

private CipherParameters getCipherParameters(byte[] pwd, byte[] salt)

{

// Use bouncycastle implementation of openssl non-standard (pwd,salt)->(key,iv) algorithm.

// Note that if a "CBC" cipher is selected, then an IV is required as well as a key. When using a password,

// Openssl

// *derives* the IV from the (pwd,salt) pair at the same time as it derives the key.

//

// * PBE = Password Based Encryption

// * CBC = Cipher Block Chaining (ie IV is needed)

//

// Note also that when the IV is derived from (pwd, salt) the salt **must** be different for each message; this is

// the default for openssl - just make sure to NOT explicitly provide a salt, or encryption security is badly

// affected.

OpenSSLPBEParametersGenerator gen = new OpenSSLPBEParametersGenerator();

gen.init(pwd, salt);

CipherParameters cp = gen.generateDerivedParameters(keyLenBits, AES_NIVBITS);

return cp;

}

public static void main(String[] args)

{

OpenSSLAesDecrypter d = new OpenSSLAesDecrypter(128);

String r = new String(d.decipher("mypassword".getBytes(),

Base64.decodeBase64("U2FsdGVkX187CGv6DbEpqh/L6XRKON7uBGluIU0nT3w=")));

System.out.println(r);

}

}

使用以下依赖项来编译/运行它:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值