java – AES应该使用哪种填充?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – AES应该使用哪种填充?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1410字,纯文字阅读大概需要3分钟。
内容图文
我已经实现了AES加密(家庭作业),但我偶然发现了填充消息的问题.
如果我的消息是这样的字节数组:
public byte[] encrypt(byte[] message) {
int size = (int) Math.ceil(message.length / 16.0);
byte[] result = new byte[size * 16];
for (int i = 0; i < size; i++) {
if ((i+1) * 16 > message.length){
//padding here????
} else {
byte[] block = Arrays.copyOfRange(message, i * 16, (i + 1) * 16);
byte[] encryptedBlock = encryptBlock(block);
System.arraycopy(encryptedBlock, 0, result, i*16, 16);
}
}
return result;
}
我该如何填写此类邮件?
我不能使用零填充,因为每个字节可能为零,并且它可能会影响带有尾随零的此类消息.
我找不到任何关于如何完成甚至here(描述AES加密的论文)的参考
解决方法:
您可以使用多种方法,从简单到高级. Bruce Schneier提出了两种相当简单的方法:
一种是用n个字节填充最后一个块,所有值都为n,这就是Alex Wien所建议的.这有问题(包括限制您长度小于256字节的块大小).这种填充模式称为PKCS#7填充(用于16字节块)或PKCS#5填充(用于8字节块).
另一种是附加一个值为0x80的字节(一个值为二进制值为1000 0000的字节),后跟填充最后一个块所需的零字节数.此方法称为ISO填充,它是ISO / IEC 9797-1填充方法2的缩写.填充本身是位级填充,添加单个值1,然后添加0值位,直到到达块尺寸.
至于如何知道消息是否被填充,答案是一个消息将始终被填充:即使消息的最后一个块完全适合一个块(即消息的大小是块大小的倍数),你将不得不添加一个虚拟的最后一个块.
如果您有兴趣研究一些更高级的方法,请在维基百科上查找一种称为密文窃取的技术:http://en.wikipedia.org/wiki/Ciphertext_stealing
内容总结
以上是互联网集市为您收集整理的java – AES应该使用哪种填充?全部内容,希望文章能够帮你解决java – AES应该使用哪种填充?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。