小程序开发AES-128-CFB,加密结果不对解密出来却是对的,而且正式数据会冒出两个多余字节

诗音shiyin 2018-11-27 05:29:19
这是测试的代码,
 var text = crypto.Utf8.parse(String.fromCharCode(0x11, 0x22, 0x33, 0x44, 0x55, 0x66));
console.log('----------------------------------------------------------明文:', text);

var keys = hexMD5(0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12);
var XMD5Keys = crypto.Utf8.parse(this.DEE(keys));
console.log('----------------------------------------------------------密钥:', XMD5Keys);

var iv = hexMD5(0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xef,0xcd,0xab,0x89,0x67,0x45,0x23,0x01);
var EMD5iv = crypto.Utf8.parse(this.DEE(iv));
console.log('----------------------------------------------------------向量:', EMD5iv);


var mi = new crypto.AES().encrypt(text, XMD5Keys, {iv: EMD5iv,mode: crypto.Mode.CFB,padding: crypto.Padding.NoPadding});
console.log('----------------------------------------------------------加密:', this.DEE(mi.ciphertext.toString()));

var v = new crypto.AES().decrypt(mi.toString(), XMD5Keys, {iv: EMD5iv,mode: crypto.Mode.CFB, padding: crypto.Padding.NoPadding});
console.log('----------------------------------------------------------解密:', this.DEE(v.toString()));



这是正式的


var text = crypto.Utf8.parse(String.fromCharCode(0xA5, 0xB1, 0x04, 0x01, 0x00));

var XMD5Keys = crypto.Utf8.parse(this.DEE(hexMD5(this.DEE(2a6938114530))));
var EMD5iv = crypto.Utf8.parse(this.DEE(hexMD5(this.DEE(e6ff6b0257d5de7ea610f219d29feb69))));


var mi = new crypto.AES().encrypt(text, XMD5Keys, { iv: EMD5iv, mode: crypto.Mode.CFB, padding: crypto.Padding.NoPadding });
var mi1 = mi.ciphertext.toString();
var mi2 = mi1.toUpperCase();
console.log('----------------------------------------------------------加密:', this.DEE(mi1));


var v = new crypto.AES().decrypt(mi.toString(), XMD5Keys, {iv:EMD5iv,mode:crypto.Mode.CFB,padding:crypto.Padding.NoPadding});
console.log('----------------------------------------------------------解密:', this.DEE(v.toString()));




var typedArray = new Uint8Array(mi2.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
}))
var buffer1 = typedArray.buffer

wx.writeBLECharacteristicValue({
deviceId: this.data.deviceId,
serviceId: this.data.service_id,
characteristicId: this.data.characteristics,
value: buffer1,
success: function (res) {
console.log('发送数据:' + '√');
},
})






这是DEE的代码,用来把一个字符串转成 0x11,0x22 这种格式

DEE: function(num) {
var num = num.toUpperCase();
var num = (num || 0).toString();
var result = '';
while(num.length > 2) {
result = ',0x' + num.slice(-2) + result;
num = num.slice(0, num.length - 2);
}
if (num) { result = num + result; }
return '0x' + result;
},



求助!
...全文
320 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
CNBJX-原创函数,首发CSND 3.1 Base64 ------------------------------------------------------------------------------- Base64Decode(Str) Base64DecodeRaw(Str) as byte() Base64Encode(Str) FileBase64(file) 3.2 Hex ------------------------------------------------------------------------------- HexDecode(Str) HexDecodeRaw(Str) as byte() HexEncode(Str) File2Hex(file) 3.3 hash String ------------------------------------------------------------------------------- stringOrByte : 可以是字条串或字节数组 ChatSet : 可选,指定编码 MD2(stringOrByte, [ChatSet As String]) As String MD4(stringOrByte, [ChatSet As String]) As String MD5(stringOrByte, [ChatSet As String]) As String SHA1(stringOrByte, [ChatSet As String]) SHA256(stringOrByte, [ChatSet As String]) As String SHA384(stringOrByte, [ChatSet As String]) As String SHA512(stringOrByte, [ChatSet As String]) As String 3.4 hash Byte ------------------------------------------------------------------------------- abytData : 字节数组 asp里请加()号 如: bytes="" md5_byte((bytes),0,0) 可选参数 iStart iEnd 默认为0,取整个 bytes的hash值 ---------------------------------------------------- [可选] iStart: 起始位置 [可选] iEnd:结束位置 分块取值有几种情况 1: iStart = 0 , iEnd = 1024 * 1024 * 1 '读取前面1M 2: iStart = -1024 * 1024 * 1 , iEnd = 0 '读取后面1M 3: iStart = 10, iEnd = iStart + 10 '读取第10个字节后的10个字节 (10-20) 4: iStart = -20,iEnd = -10 '读取尾部 (-20 -> -10 的字节) ---------------------------------------------------- MD2_Byte(abytData As Array(Byte), [iStart As Double = 0], [iEnd As Double = 0]) As String MD4_Byte(abytData As Array(Byte), [iStart As Double = 0], [iEnd As Double = 0]) As String MD5_Byte(abytData As Array(Byte), [iStart As Double = 0], [iEnd As Double = 0]) As String SHA1_Byte(abytData As Array(Byte), [iStart As Double = 0], [iEnd As Double = 0]) As String SHA256_Byte(abytData As Array(Byte), [iStart As Double = 0], [iEnd As Double = 0]) As String SHA384_Byte(abytData As Array(Byte), [iStart As Double = 0], [iEnd As Double = 0]) As String SHA
QuickEncrypt,数据安全小工具,采用托盘图标、悬浮窗、鼠标拖拽、右键菜单的简单操作模式,提供文件、文本的加解密(RC4+AES)、Hash(MD5+SHA1)、安全擦除等功能。独有的“智能压缩”加密模式。 1.功能介绍 对鼠标拖入的文本进行加解密 对剪贴板中的文本进行加解密 对鼠标拖入的文件进行加解密 对鼠标拖入的文件进行擦除 对鼠标拖入的文本进行Hash计算 对剪贴板中的文本进行Hash计算 对鼠标拖入的文件进行Hash计算 针对文本和文件加解密的智能数据压缩技术 支持超过4GB的大文件 2.安全机制 2.1 文件擦除策略 a.修改文件名为随机串; b.以32字节的块向文件写入全0; c.刷新数据,关闭文件; d.修改文件名为随机串; e.以32字节的块向文件写入全1; f.刷新数据,关闭文件; g.截断文件大小为0; h.删除文件。 经测试常用数据恢复软件无法成功恢复原有数据。 2.2 Hash算法 使用OpenSSL 0.98提供的MD5(128位)和SHA1(160位)算法。 2.3 加解密密钥生成 将用户输入的密码明文转换成utf-8字节数组(不包含0结束符),计算MD5和SHA1,将MD5结果用作AES 128位密钥,将SHA1结果用作RC4密钥。 2.4 文本加密策略 a.将明文数据转换成utf-8字节数组(包含0结束符); b.对明文字节数组计算CRC32校验码,用于解密时校验,并将CRC32值放在明文首字节之前; c.尝试压缩步骤b的结果(zlib level9),若获得较小的压缩结果则输压缩后的编码数组,否则放弃压缩,直接输步骤b的结果; d.对步骤c的结果进行RC4流加密(OpenSSL 0.98); e.对步骤d的结果进行AES_CFB_128分组加密(OpenSSL 0.98); f.对步骤e的结果进行Base64编码(OpenSSL 0.98); g.将标记"QE:|"附加在步骤f的结果之前,输结果。 2.5 文件加密策略 a.判断输入文件的扩展名是否是压缩格式,对常见压缩格式和流媒体编码文件不启用数据压缩功能; b.以1MB大小分块,读入明文文件数据; c.对分块的明文数据计算MD5,附加在待加密数据之前,用于解密时校验; d.尝试压缩1MB大小的分块,若获得较小的压缩结果则输压缩后的编码数据,否则直接输原文; e.对步骤d的结果进行RC4流加密(OpenSSL 0.98); f.对步骤e的结果进行AES_CFB_128分组加密(OpenSSL 0.98); g.将分块数据依次写入输文件,输文件的文件名是在原文件名后加".enc"。

3,143

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧