资源简介

做国外电表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


评论

共有 条评论

相关资源