java aes 不填充_java – AES应该使用哪种填充?

我已经实现了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值位,直到到达块尺寸.

至于如何知道消息是否被填充,答案是一个消息将始终被填充:即使消息的最后一个块完全适合一个块(即消息的大小是块大小的倍数),你将不得不添加一个虚拟的最后一个块.

标签:java,aes,cryptography,padding,block

来源: https://codeday.me/bug/20190826/1725272.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值