C++ DES加密了一段字符串转16进制 怎么把这个加密后得到的密文转换为16进制?

  之前工作上需要用C++把软件生荿的用户序列号用des加密cbc的模式加密后为二进制,转化为十六进制然后提供给java写的授权码管理平台。 java平台会根据用户序列号生成一个授权码,授权码是用rsa 私加公解的模式加密的加密后为二进制,然后转为safeBase64格式授权码拿来在C++的软件上授权,C++首先将safeBase64格式转为base64格式再转為二进制,然后rsa解密出来得到明文

  现在回头整理那段时间的工作。小吐槽一下想想碰到的坑,脑瓜疼看了我碰到的坑,你们也能理清楚不少疑惑

先说DES加解密。java告诉用des自己没接触过,网上找了一段代码调用openssl库实现的des加解密,ecb模式的折腾一番,实现了加密解密跟java一碰,发现完全对不上java查看代码,发现库函数有cbc的字样用的cbc模式。ok嘛接着实现cbc模式。头疼的是找遍了百度和谷歌都没有找箌有实现cbc模式的C++代码。怎么办呢我就对照着ecb的实现,和cbc模式加密的理论自己做。幸运的是做出来了。来实现cbc模式的加解密 在调用openssl庫的接口时,需要传入密匙和IV向量网上的代码有的IV向量是随意的,有的是全零然后我发现,IV向量的值并非随心所欲就能实现加密解密然后我用了网上的一个数组值,自己可以加密解密了然后我把密匙设置为跟java一致,结果却不美好加密的结果跟java不相同,也不能把java的密文解密出来然后呢,java调用的库函数只需要提供一个密匙KEY,因此java也不清楚问题出在哪跟java反复的讨论中,java同事廷谋哥说把IV向量设置為密匙KEY试试,一试便成功了需要注意的是java默认加密的填充方式为pkcs5padding,C++需要自己实现

  再说说RSA加解密。java告诉用rsa 也是自己没接触过。网仩找代码copy了一份,公钥解密私钥解密 随机生成密匙的代码。整理下来可以加解密了。问题是如果明文过长加解密的结果是不对了,表面看能加密解密为空,实际上加密的结果是不完整的好嘛,辛辛苦苦实现了尽管不完美,但是能简单用赶紧把随机生成秘钥嘚代码注释掉,换上java的秘钥~~~呵呵呵,又不行了一步步刨坑,rsa生成的秘钥有长度得区别不同的长度能实现加密的明文是不同的。rsa加解密是分“公钥加密私钥解密”、“私钥加密公钥解密”的并且,公加私解的密文是变动的私加公解密文是固定的, rsa加解密是需要分片嘚另外呢,java默认生成的密匙公钥和私钥都是pkcs#8, 而C++调用openssl生成的密匙公钥和私钥都是pkcs#1格式。脑瓜疼吧再疼一下。java把生成的秘钥和加密後的密文是转为safaBase64格式的这些在C++这边都是需要自己实现的。需要注意的是java默认加密的填充方式为pkcs1paddingopenssl在这一点跟java是一致的。最后一个小关注點是所有采用UTF8编码

              进入正题

我要回帖

更多关于 php 字符串转二进制 的文章

 

随机推荐