问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急求一个基于aes算法的cbc-mac 的完整c++程序

发布网友 发布时间:2022-04-26 13:45

我来回答

2个回答

热心网友 时间:2022-04-26 14:37

之前在项目上用到AES256加密解密算法,刚开始在java端加密解密都没有问题,在iOS端加密解密也没有问题。但是奇怪的是在java端加密后的文件在iOS端无法正确解密打开,然后简单测试了一下,发现在java端和iOS端采用相同明文,相同密钥加密后的密文不一样!上网查了资料后发现iOS中AES加密算法采用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。我们知道加密算法由算法+模式+填充组成,所以这两者不同的填充算法导致相同明文相同密钥加密后出现密文不一致的情况。那么我们需要在java中用PKCS7Padding来填充,这样就可以和iOS端填充算法一致了。要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现,下面我会提供该包的下载。啰嗦了一大堆,下面是一个简单的测试,上代码!001packagecom.encrypt.file;002003004importjava.io.UnsupportedEncodingException;005importjava.security.Key;006importjava.security.Security;007008importjavax.crypto.Cipher;009importjavax.crypto.SecretKey;010importjavax.crypto.spec.SecretKeySpec;011012publicclassAES256Encryption{013014/**015*密钥算法016*java6支持56位密钥,bouncycastle支持64位017**/018publicstaticfinalStringKEY_ALGORITHM="AES";019020/**021*加密/解密算法/工作模式/填充方式022*023*JAVA6支持PKCS5PADDING填充方式024*Bouncycastle支持PKCS7Padding填充方式025**/026publicstaticfinalStringCIPHER_ALGORITHM="AES/ECB/PKCS7Padding";027028/**029*030*生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥031*@returnbyte[]二进制密钥032**/033publicstaticbyte[]initkey()throwsException{034035////实例化密钥生成器036//Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());037//KeyGeneratorkg=KeyGenerator.getInstance(KEY_ALGORITHM,"BC");038////初始化密钥生成器,AES要求密钥长度为128位、192位、256位039////kg.init(256);040//kg.init(128);041////生成密钥042//SecretKeysecretKey=kg.generateKey();043////获取二进制密钥编码形式044//returnsecretKey.getEncoded();045//为了便于测试,这里我把key写死了,如果大家需要自动生成,可用上面注释掉的代码046returnnewbyte[]{0x08,0x08,0x04,0x0b,0x02,0x0f,0x0b,0x0c,0470x01,0x03,0x09,0x07,0x0c,0x03,0x07,0x0a,0x04,0x0f,0480x06,0x0f,0x0e,0x09,0x05,0x01,0x0a,0x0a,0x01,0x09,0490x06,0x07,0x09,0x0d};050}051052/**053*转换密钥054*@paramkey二进制密钥055*@returnKey密钥056**/057publicstaticKeytoKey(byte[]key)throwsException{058//实例化DES密钥059//生成密钥060SecretKeysecretKey=newSecretKeySpec(key,KEY_ALGORITHM);061returnsecretKey;062}063064/**065*加密数据066*@paramdata待加密数据067*@paramkey密钥068*@returnbyte[]加密后的数据069**/070publicstaticbyte[]encrypt(byte[]data,byte[]key)throwsException{071//还原密钥072Keyk=toKey(key);073/**074*实例化075*使用PKCS7PADDING填充方式,按如下方式实现,就是调用bouncycastle组件实现076*Cipher.getInstance(CIPHER_ALGORITHM,"BC")077*/078Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());079Ciphercipher=Cipher.getInstance(CIPHER_ALGORITHM,"BC");080//初始化,设置为加密模式081cipher.init(Cipher.ENCRYPT_MODE,k);082//执行操作083returncipher.doFinal(data);084}085/**086*解密数据087*@paramdata待解密数据088*@paramkey密钥089*@returnbyte[]解密后的数据090**/091publicstaticbyte[]decrypt(byte[]data,byte[]key)throwsException{092//欢迎密钥093Keyk=toKey(key);094/**095*实例化096*使用PKCS7PADDING填充方式,按如下方式实现,就是调用bouncycastle组件实现097*Cipher.getInstance(CIPHER_ALGORITHM,"BC")098*/099Ciphercipher=Cipher.getInstance(CIPHER_ALGORITHM);100//初始化,设置为解密模式101cipher.init(Cipher.DECRYPT_MODE,k);102//执行操作103returncipher.doFinal(data);104}105/**106*@paramargs107*@throwsUnsupportedEncodingException108*@throwsException109*/110publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{111112Stringstr="AES";113System.out.println("原文:"+str);114115//初始化密钥116byte[]key;117try{118key=AES256Encryption.initkey();119System.out.print("密钥:");120for(inti=0;i

热心网友 时间:2022-04-26 17:29

你的这个16字节向量是想做IV?那我认为手动输入这个比较好,随机产生的这个IV值并不会增加你的加密强度,你可以看看《密码导论》里面好像有这个的证明。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...有点像牙刷加大版 很久没用 毛毛里全是霉点 怎么去除呀。 是什么样的有机溶剂能把牙刷的毛除掉 如何让牙刷上的刷毛没了,我只想留牙刷柄 蛋仔派对2月兑换码有哪些-2月兑换码永久免费领取 ...因此导体串联后总电阻 ___;导体并联后相当于增加导体的... 两个定值电阻串联在一起的总电阻比任何一个分电阻都___,它的实质是相 ... 租房时需要哪些材料 苹果改密码时忘记了密码怎么办 点点卡通人物 求人给我找一个情侣头像,有图 大家好,有VC++ DES-CBC代码吗,VB也成,要CBC模式的 openssl中有没有HMAC-SHA1,CBC-MAC算法 aes加密算法有多少种模式 openssl加密数据为8倍数,怎么多出8位 差分格式的TVD和CBC格式—MINMOD及SMART 加密算法 AES_256_CBC 安全性如何? 证明为什么cbc和cfb方式的解密过程实际上得到的是有效的解密 基于DES算法的CBC演示程序实现(java) 有谁会写java的Blowfish-CBC加密算法吗? 制动力分配EBD/CBC是什么 JAVA DES CBC算法 AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有什么区别 CBC是什么意思? 打字时如何切换标点符号的大小? 初级会计证报名时间2021入口哪个? 打字的时侯怎么弄标点符号 初级会计在哪个网站报名缴费? vivoy5s声控叫出小v怎么设置? vivo手机y5s怎么样,可以开启语音唤醒功能吗? 平板电脑做自媒体好用吗 虚拟专网的加密算法说明 分组密码的算法要求 英雄联盟裁决之镰现在是多少局了?我打了30多局还没消除,打完又没显示还剩多少局,就是无底洞 主板蓝筹股是什么? 股市里的创业板和蓝筹股是怎么分别的?有标志吗? lol裁决之镰最多能裁决几次 lol裁决之镰最多能裁决几次惩罚。 LOL裁决之镰这个机制是不是没有了? 纽约公共图书馆的介绍 纽约公共图书馆的概况 美国纽约法拉盛图书馆 国外有哪些图书馆是比较出名的? 请问纽约大学的图书馆怎么样?能给我介绍下吗? 曼哈顿的中央大道,第五大道,都有哪些值得去的地方? 纽约公共图书馆的历史 纽约第五大街图书馆叫什么名字 纽约植物园的学术图书馆 纽约法拉盛图书馆的设计者是谁 美国一些著名的电影中都出现过哪些著名的纽约地标? 跪求 书缘:纽约公共图书馆 百度云免费在线观看资源