赞
踩
md5 和 sha-1这两个散列函数就是用来分割数据滴。
注:
分割那么一大块数据,其实只需要64字节(也就是 64 * 8 = 512位)。所以呢由于数据块的长度是64字节,咱用密钥+散列函数进行摘要(digest)的时候的数据完整性,最终加进数据的密钥必须保证为64字节。
密钥(key)的长度可以是小于等于数据块长度的任何正整数值。
注:
if (key.length >block.length (数据块长度64)){
key = 散列函数(key)(其中得到的结果key的长度和散列函数输出数据的长度相等,md5 是 16字节,sha是20字节)
}
过程:
假定key ,keylength,block,blockLength,正常分组长度 block_bytes
散列函数 sanlie()
NSData *dataKey = key.data;
//如果key的长度比分组长度大
if(keylength > block_bytes)
{
得到的字节数据data = sanlie(key);
dataKey = [data bytesWithLength : 16] 取其中16字节长的数据
}
if (keylength < blocksize){
datakey = [datakey appendBytes:0 length:blocksize - keylength];
}
//定义两个长度为256的数组元素值为0的数组
o_key_pad [256] = {0x00};
i_key_pad [256] = {0x00};
//对于dataKey的每一个字节分别和0x5c 0x36进行 进行异或运算 得到两个结果 o_key_pad[i] 和i_key_pad[i]
unsigned char *cKey = (unsigned char *)dataKey.bytes;
for (int i = 0; i < blockSize; i++) {
o_key_pad[i] = 0x5c ^ cKey[i];
i_key_pad[i] = 0x36 ^ cKey[i];
}
//将 要加密的数据data 拼接到i_key_pad数组后面得到数据data1
data1 = i_key_pad + data;
//对拼接后得到的 data1 进行一次散列运算
data1 = sanlie(data1)
//将data1 和 o_key_pad拼接起来得到 data2
data2 = data1 + o_key_pad
//对拼接后得到的 data2 进行一次散列运算
data2 = sanlie(data2)
//data2为最终的加密数据
步骤:
(1)将key 用0填补为64字节的字符串(str)
(2)将上一步的结果字符串(str) 和 0x36 进行异或运算 得到结果字符串(istr)
(3)将数据流(data) 附加到 上一步的结果字符串(istr)
(4)做散列运算于第(3)步的结果字符串(istr)
(5)将第(1)步得到的字符串(str)与 ox5c进行异或运算 得到结果字符串(ostr)
(6)将第(4)步得到的结果(istr)附加到第五步的结果字符串的结尾(ostr)
(7)对第(6)步得到的ostr 做散列运算得到最终结果(out)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。