如果我用128位key,使用AES算法。加密后,结果的长度有什么规律。
我写了代码
case 1
src=123456789,加密后=26d2909f80c990426fd8836c31638718case 2
src=123456789123456789123456789,加密后=c0321124ee2fa54e5a153b7a94c9b1d33b5c33091ac6746eedcb869fc4b4795b
也就是说加密结果的长度是根据输入的长度决定的。这对吗?我不确定。
我写了代码
case 1
src=123456789,加密后=26d2909f80c990426fd8836c31638718case 2
src=123456789123456789123456789,加密后=c0321124ee2fa54e5a153b7a94c9b1d33b5c33091ac6746eedcb869fc4b4795b
也就是说加密结果的长度是根据输入的长度决定的。这对吗?我不确定。
我告诉你吧,java已经封装的aes算法只满足128key,加密后长度是在以16byte[]返回的,因为读取原文的时候是从头开始选取16个字节,然后转换为byte,再根据s盒子开始第一轮加密,所以,密文只会返回32字节,因为会把byte拆分,迭代等。
也就是说,小于16字节的原文会得到32字节长度的密文
大于16字节的,就是16*n长的原文会得到32*n长度的密文
就好比楼主提供的数据,src=123456789123456789123456789长度27,所以得到32*2长度的密文
如果说看他的源码,其实很多书上都有,理论能明白已经不错了,那程序呢?基本中国的AES加密类都是抄来得源码
当时,我苦苦追求java和c#的同步,研究源码,并且扩展到256key(api和c#只提供了128key强度),基本没有人能给我帮助,我不是密码学专业,所有的外面的老师都没有听过AES,培训单位的老师也不知道
当快要交毕业设计的时候,我求助我的辅导老师,他居然和我说java直接调用他的AES加密类就可以了
我倒,那还叫毕业设计吗?不研究源码怎么互通?他说,答辩老师不看得OMG
更可笑的是,答辩的老师只有一个知道有java这个东西,其他都是硬件方面的老师,有个老师问我,你的C++怎么写成#了?我差点晕过去,他们居然不知道有c#
所以,AES的原理资料,特别是java的很少很少, 所谓的资料都是抄来抄去的,但是很少人能说清楚具体的情况(专门学习AES的除外)
我的毕业论文,个人认为现在是极其宝贵的AES原理分析和代码解析(AES+c#)
1)hash算法,也叫散列
是不可逆的
MD5/SHA-1将任何数据生成16位的byte[]2)对称算法
需要key,算法是可逆的,也就是说同一个key同时可以加密和解密
根据算法,key的长度每个算法不一样
--DES,比较久了,听说不安全了
-- AES,比较新。java的实现,是每128bits计算一次。需要加密的字串越长,加密的结果就越长
3)公钥密钥算法
需要两个key,公钥和密钥。 公钥加密,密钥解密.
--RSA,比较通用。 HTTPS/SSL就是用它
对称加密是指加解密的密钥相同;
AES加密,如果输入是16*n字节,没有填充的情况下,输出和输入相同;有填充的情况下,输出是16*(n+1)。
如果输入不是16字节整数倍,而是大于16*n小于16*(n+1),没有填充的情况下(只能是CFB和OFB模式),输出和输入长度相同;有填充情况下,输出长度是16*(n+1);
gao11811的表述有误,毕业论文也许再自己检查一下