-
大小: 97KB文件类型: .rar金币: 2下载: 1 次发布日期: 2021-05-07
- 语言: 其他
- 标签: GCM-AES-128 aes_wrap aes_unwrap
资源简介
做国外电表DLMS加解密必用的算法,费劲我几个月的整理修改,总算把这GCM-AES-128的加解密算法和密钥传输的包裹算法弄好。算是商业机密吧,呵呵!据说有厂家为数据传输加解密前前后后搞了2年。
压缩包里有三个代码文件,附有测试程序和测试数据。
同行的人,肯定认为这10分值的。
代码片段和文件信息
#include “StdAfx.h“
#include “DHCryptlib.h“
#include
#include
#include
#if defined(__cplusplus)
extern “C“
{
#endif
#define _MaxText_Length_ 1024 //最大加解密数据长度
mh_decl void xor_block_aligned(void *r const void *p const void *q)
{
rep3_u4(f_xor UNIT_PTR(r) UNIT_PTR(p) UNIT_PTR(q) UNIT_VAL);
}
gf_decl void gf_mulx1_lb(gf_t r const gf_t x)
{
gf_unit_t _tt;
_tt = gf_tab[(UNIT_PTR(x)[3] >> 17) & MASK(0x80)];
rep2_d4(f1_lb UNIT_PTR(r) UNIT_PTR(x));
UNIT_PTR(r)[0] ^= _tt;
}
void init_4k_table(const gf_t g gf_t4k_t t)
{
int j k;
memset(t[0] 0 GF_BYTE_LEN);
memcpy(t[128] g GF_BYTE_LEN);
for(j = 64; j >= 1; j >>= 1)
gf_mulx1(mode)(t[j] t[j + j]);
for(j = 2; j < 256; j += j)
for(k = 1; k < j; ++k)
xor_block_aligned(t[j + k] t[j] t[k]);
}
#define xor_4k(iaptr) gf_mulx8(mode)(r); xor_block_aligned(r r t[ap[GF_INDEX(i)]])
# define ls_box(xc) four_tables(xt_use(fl)vf1rf2c)
#define ke4(ki) \
{ k[4*(i)+4] = ss[0] ^= ls_box(ss[3]3) ^ t_use(rc)[i]; \
k[4*(i)+5] = ss[1] ^= ss[0]; \
k[4*(i)+6] = ss[2] ^= ss[1]; \
k[4*(i)+7] = ss[3] ^= ss[2]; \
}
#define v(ni) ((n) - (i) + 2 * ((i) & 3))
#define k4e(ki) \
{ k[v(40(4*(i))+4)] = ss[0] ^= ls_box(ss[3]3) ^ t_use(rc)[i]; \
k[v(40(4*(i))+5)] = ss[1] ^= ss[0]; \
k[v(40(4*(i))+6)] = ss[2] ^= ss[1]; \
k[v(40(4*(i))+7)] = ss[3] ^= ss[2]; \
}
#define kdf4(ki) \
{ ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \
ss[1] = ss[1] ^ ss[3]; \
ss[2] = ss[2] ^ ss[3]; \
ss[4] = ls_box(ss[(i+3) % 4] 3) ^ t_use(rc)[i]; \
ss[i % 4] ^= ss[4]; \
ss[4] ^= k[v(40(4*(i)))]; k[v(40(4*(i))+4)] = ff(ss[4]); \
ss[4] ^= k[v(40(4*(i))+1)]; k[v(40(4*(i))+5)] = ff(ss[4]); \
ss[4] ^= k[v(40(4*(i))+2)]; k[v(40(4*(i))+6)] = ff(ss[4]); \
ss[4] ^= k[v(40(4*(i))+3)]; k[v(40(4*(i))+7)] = ff(ss[4]); \
}
#define kd4(ki) \
{ ss[4] = ls_box(ss[(i+3) % 4] 3) ^ t_use(rc)[i]; \
ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \
k[v(40(4*(i))+4)] = ss[4] ^= k[v(40(4*(i)))]; \
k[v(40(4*(i))+5)] = ss[4] ^= k[v(40(4*(i))+1)]; \
k[v(40(4*(i))+6)] = ss[4] ^= k[v(40(4*(i))+2)]; \
k[v(40(4*(i))+7)] = ss[4] ^= k[v(40(4*(i))+3)]; \
}
#define kdl4(ki) \
{ ss[4] = ls_box(ss[(i+3) % 4] 3) ^ t_use(rc)[i]; ss[i % 4] ^= ss[4]; \
k[v(40(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \
k[v(40(4*(i))+5)] = ss[1] ^ ss[3]; \
k[v(40(4*(i))+6)] = ss[0]; \
k[v(40(4*(i))+7)] = ss[1]; \
}
AES_RETURN aes_encrypt_key128(const unsigned char *key aes_encrypt_ctx cx[1])
{
uint_32t ss[4];
cx->ks[0] = ss[0] = word_in(key 0);
cx->ks[1] = ss[1] = word_in(key 1);
cx->ks[2] = ss[2] = word_in(key 2);
cx->ks[3] = ss[3] = word_in(key 3);
ke4(cx->ks 0); ke4(cx->ks 1);
ke4(cx->ks 2); ke4(cx->ks 3);
ke4(cx->ks 4); ke4(cx->ks 5);
ke4(cx->ks 6); ke4(cx->ks 7);
ke4(cx->ks 8);
ke4(cx->ks 9);
cx->inf.l = 0;
cx->
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 32813 2012-11-23 09:05 源码\AESGCM.cpp
文件 20280 2012-11-10 09:13 源码\AESHead.h
文件 10078 2012-11-13 15:39 源码\DHCryptlib.h
文件 315904 2012-10-29 13:17 AES128GCM.exe
文件 9022 2006-10-27 18:49 gcm.1
目录 0 2012-12-07 23:09 源码
----------- --------- ---------- ----- ----
388097 6
评论
共有 条评论