[英]AES 128bit ECB Encryption Ciphered Text Overflow
我目前正在尝试使用 BouncyCastle 库制作一个程序,以使用十六进制密钥(长度为 16)加密和解密十六进制字符串(长度为 16)。 但是,它可以工作,但在加密后,密文的长度是预期的两倍(当前输出长度为 32,预期输出长度为 16)。
电流输出:
Input: helloworldsingap
Length: 16
Key: 0000000000000000000000000000004D
Length: 16
Cipher: 47DDFB51938DB86E6CC3EF9F078C78C6FC5E0686775522C07BB46BAB18E0FCFA
Length: 32
Output: helloworldsingap
Length: 16
预期输出:
Input: helloworldsingap
Length: 16
Key: 0000000000000000000000000000004D
Length: 16
Cipher: 47DDFB51938DB86E6CC3EF9F078C78C6
Length: 16
Output: helloworldsingap
Length: 16
对于我当前的输出,密文的前半部分是正确的。 有谁知道我当前输出的密码末尾的额外 16 个字符是什么,我该如何删除它?
这是我的程序:
package com.optixal.tests;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AES128ECB {
public static void main(String[] args) throws Exception {
Security.addProvider(new BouncyCastleProvider());
// Input
String hexInput = "68656c6c6f776f726c6473696e676170";
byte[] byteInput = toByteArray(hexInput);
// Key
String hexKey = decToHex(77);
byte[] byteKey = toByteArray(hexKey);
System.out.println(" Input: " + new String(byteInput));
System.out.println("Length: " + byteInput.length + "\n");
System.out.println(" Key: " + hexKey);
System.out.println("Length: " + byteKey.length + "\n");
SecretKeySpec key = new SecretKeySpec(byteKey, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
// Encrypt
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = new byte[cipher.getOutputSize(byteInput.length)];
int ctLength = cipher.update(byteInput, 0, byteInput.length, cipherText, 0);
ctLength += cipher.doFinal(cipherText, ctLength);
System.out.println("Cipher: " + toHexString(cipherText));
System.out.println("Length: " + ctLength + "\n");
// Decrypt
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
ptLength += cipher.doFinal(plainText, ptLength);
System.out.println("Output: " + new String(plainText));
System.out.println("Length: " + ptLength);
}
private static final String hexDigits = "0123456789ABCDEF";
private static final char[] hexDigitsArray = hexDigits.toCharArray();
public static String decToHex(int dec) {
final int sizeOfIntInHalfBytes = 32;
final int numberOfBitsInAHalfByte = 4;
final int halfByte = 0x0F;
StringBuilder hexBuilder = new StringBuilder(sizeOfIntInHalfBytes);
hexBuilder.setLength(sizeOfIntInHalfBytes);
for (int i = sizeOfIntInHalfBytes - 1; i >= 0; --i) {
int j = dec & halfByte;
hexBuilder.setCharAt(i, hexDigitsArray[j]);
dec >>= numberOfBitsInAHalfByte;
}
return hexBuilder.toString();
}
public static String toHexString(byte[] array) {
return DatatypeConverter.printHexBinary(array);
}
public static byte[] toByteArray(String s) {
return DatatypeConverter.parseHexBinary(s);
}
}
谢谢!
在线使用AES/ECB/NoPadding
而不是AES/ECB/PKCS7Padding
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
将解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.