AES/ECB/NoPadding 全0填充代码

加密算法:

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
int blockSize = cipher.getBlockSize();

byte[] dataBytes = sSrc.getBytes();
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
    plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}

byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

SecretKeySpec keyspec = new SecretKeySpec(sKey.getBytes(), "AES");

cipher.init(Cipher.ENCRYPT_MODE, keyspec);
byte[] encrypted = cipher.doFinal(plaintext);

String base64encodedString = new BASE64Encoder().encode(encrypted);

return base64encodedString;

解密算法:

sSrc = sSrc.replaceAll("\\s", ""); //去掉空白字符
byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
SecretKeySpec keyspec = new SecretKeySpec(sKey.getBytes(), "AES");

cipher.init(Cipher.DECRYPT_MODE, keyspec);

byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;

测试类:

/*
 * 此处使用AES-ECB加密模式。
 */
String cKey = "222fguAJf9bpI4ptUZ";
// 需要加密的字串
String cSrc = "hello";
System.out.println(cSrc);
// 加密
String enString = AESUtils.encrypt(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);

// 解密
String DeString = AESUtils.decrypt(enString, cKey);
System.out.println("解密后的字串是:" + DeString);

问题:1.base64超过76的长度以后,会加\r\n和空格隔开,java默认的base64解析器没有处理这个,这其实是java的问题了 base64的规矩就是会换行的,需要手动过滤一下,把\r\n和空格去掉,data = data.replaceAll("\\s", "");用这个把要解密的东西去掉空白字符,就是\r\n和空格,如果不想手动去空格的话,就不用java.util的base64改用sun.misc下的BASE64Decoder,这是个安全杂项(MISC)包,里面加解密各种工具还蛮全的。

你可能感兴趣的:(java)