问题描述
按照给定的步骤,我已经执行了加密,但是出现错误。
- 生成一个16位随机数(会话密钥)。说
RANDOMNO
。RANDOMNO = 1111222233334444
- 使用RSA / ECB / PKCS1Padding加密
RANDOMNO
并使用Base64进行编码。说ENCR_KEY
。ENCR_KEY = B64Encode(RSA/ECB/PKCS1Encryption(RANDOMNO,ICICIPubKey.cer))
- 使用
RANDOMNO
作为密钥和初始化集对请求有效负载执行AES / CBC / PKCS5Padding加密。说ENCR_DATA
。ENCR_DATA = B64Encode(AES/CBC/PKCS5Padding(REQUEST_DATA,RANDOMNO,IV))
- 现在,客户端可以从以下两个选项之一中选择在请求中发送IV。 在“ iv”标签中发送Base64编码的IV。
public byte[] generaterandomBytes() {
SecureRandom ng=new SecureRandom();
byte[] randomBytes=new byte[16];
ng.nextBytes(randomBytes);
return randomBytes;
}
//new method for encryption -we need to check
public String encryptRandomKeyWithCertificate(byte[] randomNumber) throws BadPaddingException,IllegalBlockSizeException,InvalidKeyException,NoSuchPaddingException,NoSuchAlgorithmException,FileNotFoundException,CertificateException {
//step2: encrypt the random number with certificate
FileInputStream fin = new FileInputStream("D:\\cedge_uat\\ICICIUATpubliccert.cer");
CertificateFactory f = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
PublicKey publicKey = certificate.getPublicKey();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
byte[] cipherData = cipher.doFinal(randomNumber);
String encodedData = Base64.getEncoder().encodetoString(cipherData);
return encodedData;
}
public String encryptRequestWithKey(String text,byte[] randomNumber) throws Exception {
//step3: encrypt the requestString with randomkeyEncrypted
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
BASE64Decoder decoder = new BASE64Decoder();
SecretKeySpec keySpec = new SecretKeySpec(randomNumber,"AES");
IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
byte[] cipherData = cipher.doFinal(text.getBytes());
// BASE64Encoder encoder = new BASE64Encoder();
//return encoder.encode(cipherData).replaceAll("[\r\n]+","");
String encodedData = Base64.getEncoder().encodetoString(cipherData);
return encodedData;
}
public static void main(String[] args) throws IOException {
String requestString = "CORP_USER=";
byte[] randomNumber;
String encryptedKey;
try {
randomNumber=encryption.generaterandomBytes();
encryptedKey = encryption.encryptRandomKeyWithCertificate(randomNumber);
String encryptedData =encryption.encryptRequestWithKey(requestString,randomNumber);
} catch (Exception e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
解决方法
根据AES encryption上的Wikipedia页面,AES密钥可以为128、192或256位;例如,即16、24或32个字节。
您提供的密钥的大小取决于生成的“随机”数字字符串。看起来它将介于1到19位数字之间,并带有可能的符号。当您在该字符串上调用Index | Line Item | Insertion Order | Creative Type
_________________________________________________________________________________________________
1 | blbl 33 dEs '300x600' Q3 | hello 444 | RISING STARS
2 | QQQ4 Hello trueview Apple | something 68793274 | VIDEO
3 | A useless string | pre-roll Video <10 tttt 89 CASIO | VIDEO
4 | Something not in dict | Neither here | NaN
时,您将获得一个字节数组,其范围在1到20个字节之间。通常,这不是AES可接受的密钥大小之一。
您应该做的是使用getBytes()
并为AES提供三个可接受的密钥大小之一的字节数组。