用C语言实现的128位AES加密算法,可以运行在JAVA的JNI 中AIS加密算法c语言实现代码
nt cnt
for(ent =0: cnt< 8: cnt++)
BvtcToBit(*(ch+cnt), bit+(ent<<3))
return
/将二进制位串转为长度为8的字符串水
int Bit64ToChar8 (ElemType bitL64, ElemType ch18)
int cnt
memset(ch, 0, 8)
for(ent-0: cnt<8: cnt++i
BitToByte(bit+(cnt<<3), ch+cnt)
return 0
/*生成子密钥
int DES Make Subkeys(ElemType key _64, ElemType subkeys [16][48])
ElemType temp 56
int cnt
DES PCI Transform(key,temp):/*PCI置换*
for(cnt=0;cnt<16;cnt+-){*16轮跌代,产生16个子密钥米
DES ROL(tenp, MOVE TIMES[cnt]);循坏左移*
DES PC2 Transform(temp, subkeys cnt]);/PC2置换,产生子密钥体
return o
/*密钥置換1*/
int DES PCI Transform(ElemType key [64, ElemType tempts[56])t
int cnt
for(cnt=0: cnt( 56 cnt++)
)empts[cnt]= key[ Ilant]
r巳turn
/*密钥置換2*
int DES PC2 Transform(Elem Type key [56], ElemType tempts[48])i
t cnt
for(ent =0: cnt< 48: cnt+)I
)pbts [cnt]= key [PC 2[cnt]]
return
/*循环左移*/
int DES ROL (Elem Type data[56], int time)t
Elem l'ype temp _56
/*保存将要循环栘动到右边的位*
memcpy(temp, data, time)
memcpy(temg-time, data+28, time)
/*前28位移动
(data-28-time, temp, time)
/*后28位移动*
memcpy(data 28, data+28+time, 28-time
memcpy (data-56-time, temp+time, time)
return o
/*P置换*/
int DES IP) Iransform(Elemlype data[64)[
ElemType temp _64]:
for(cnt
templet- datalIP Tablelcnt」」
memcpy(data, temp, 64)
return o
第3页
AIS加密算法c语言实现代码
/*IP逆置換*
int DES IP 1 Transform(ElemType data[64)(
int cnt
ElemType temp _64
for(cnt =0: cnt 64: cnt+-)i
templet」- dataLIP1 Tablelcrt]」
memcpy(data, temp, 64)
return o
/*扩展置换*/
int DES E Transform(ElemType data[48])(
Int cn
ElemType temp48」
for(ent-0: cnt 48: cnt-)
temp lent= datale Tablelent
memcpy( data, temp, 48
return o
P置换
int DES P Transform(ElemType data[32])(
t
ElemType temp_32]
for(ent =0; cnt 32; cnt+-)
temp ent-datalP Tablel 11
me.mcpy(data, temp, 32)
return 0
/水异或*
int DES XOR(Elem Type R[48, Elem Type L[48], int count)I
int cnt
for(cnt-0: cnt< count: cnt++)i
RIant]= lent]
return 0
/*S盒置换*/
int DES SBOX (Elem Type data[48])
int cnt
int line, row, output
int curl, cur
for(ent=0; cnt( 8: cnt++i
curl cnt:6
cur2= cnt<<2
/*计算在S盒中的行与列来
line=(data cur1<<1)+ data[ cur1+5
row=(data[cur1+1]<<3)+(data[cur1+2]<<2)
+(data「cur1-31<<1)+data「cur1+41
output s[cnt][line]trow]
/*化为2进制*/
data[cur2]=(output&0X08)>>3
data[cur2+1]=(output&0X04)>>2
data
(output&0X02)>1
datalcur 2+3= output&0x01
return o
交换
int DES Swap(ElemType left[32], ElemType right [32])
memcpy(temp, left, 32
memcpy(left, right, 32
memcpy (right, temp, 32
return o
第4页
AIS加密算法c语言实现代码
/*加密单个分组
int DES EncryptBlockElem Type plainBlock[8, ElemType subKeys[l6][48, ElemType cipherBlock[8])I
ElemT'ype plainTs [54]
ElemType copyRight[48]
int cnt
Char8ToBit64(plainBlock, plairBits)
/米初始置换(IP置换)*
DES IP Transform(plainBits
/*16轮迭代*
for(cnt=0: cnt< 16: cnt+-)
memcpy(copyRight, plainBits- 32, 32
/*将右半部分进行扩展置换,从32位扩展到48位*/
DES E Trans form(copyRight)
/*将右半部分与子密钥进行异或操作
DES XOR (copy
Righ
48)
/*异或结果进入S盒,输出32位结果*/
DES SBOX (copyRight)
/P置换
DES P Transform(copyRight)
/*将明文左半部分与右半部分进行异或*
DES XOR (plainBits, copyRight, 32)
最终完成左右部的交换*
DES Swap(plainBits, plainBits-32)
/逆初始置换(IPI置换)*
DES IP 1 Transform (plainBits)
Bit64ToChar8(plainBits, cipherBlock)
turn o
/*解密单个分组
int DES DecryptBlock(ElemType cipherBlock[8, ElemType subKeys[16] 18], ElemType plainBlock [81)
ElemType cipherBits[ 641
Elem Type copy Right [48]
int cnt
Char8ToBit64(cipherBlock, cipherBits)
/初始置换(IP置换)*
DES IP Transform(cipherBits
/*16轮迭代*/
for(cnt-15: cnt >-0: cnt--)i
memcpy(copyRight, cipherBits+32, 32
/*将右半部分进行扩展置换,从32位扩展到48位
DES T Trans form(copyright)
/*将右半部分与子密钥进行异或操作
DES XOR(copy Right, subKeys [ent], 48)
/*异或结果进入S盒,输出32位结果*
DES SBOX(copyRight)
/米P置换*
DES P Transform(copyright)
/*将明文h半部分与右半部分进行异或*
DES XOR (cipherBits, copy Right, 32)
f(cnt
/米最终完成左右部的交换*
DES Swap(cipherBits, cipherBits+32)
/*逆初始置换(IP1置换)*
DES IP 1 Transform(cipherBits)
Bit64ToChar8(cipherBits, plainBlock)
return 0:
*加密文件
int DES Encrypt (char xplainFile, char *keyStr, char *cipherFile)t
FILE xplain, i*cipher;
int count
ElcmType plainBlock[81, ciphcrBlock [8, keyBlock 8
第5页
AIS加密算法c语言实现代码
Elem Type bEy 64]
ElemType subKeys[16][18]
if((plain- fopen(plainFilc, " rb"))--NULL)
return Plain FILe OPEN ERROR
return CIPHER FILE OPEN ERROR: ))== NULL)(
if ((cipher fopen(cipherFile, wb
/设置密钥
memcpy (keyBlock, key Str, 8)
将密钥转换为二进制流*
Char8ToBit64(keyBlock, bKcy
/牛成子密钥*
DES Make SubKeys(bEy, subKeys
while(!feof plain))(
/*每次读8个字节,并返回成功读取的字节数*
if((count- fread(plainBlock, sizeof(char),8, plain))
8){
DES EncryptBlock (plainBlock, subKeys, cipherBlock
f(count)[
/*填充*/
memset(plainBlock
ount, \0, 7- count)
/*最后一个字符休存包括最后一个字符在内的所填充的字符数量水
plainblockl7-8-count
DES EncryptBlock (plainBlock, subkeys, cipherBlock
fwrite(cipherBlock, sizeof (char), 8, cipher)
fclose (plain)
f'c. lose(cipher
return oK
/*解密文件*
int DES Decrypt(char *cipherFile, char *key Str, char xplainFile)i
FILE* plain,米 cipher
int count, times 0
long fileLen
Eleml'ype plainBlock [8], cipherBlock[8], keyBlock[8
ElemType bEy _6
ElemType subKeys[16][48]
if ((cipher fopen(cipherFile, rb ))= NULL)[
return CIPHEr FILe OPEN ERROR
if((plain= fopen(plainFile, wb" ))= NULL)
rcturn plain FIle OPEN ERROR
/*设置密钥*
memcpy(key Block, keyStr, 8)
/将密钥转换为二进制流*
Char8ToBit64 (keyBlock, bKey)
/水生成子密钥*
ES Make SubKeys(bKey subKeys)
/取文什长度*/
fseek( cipher,0, SEEK END);/将文件指针置尾
fi lelen= ftel l( cipher);/*取文件指针当前位置*/
rewind( CIpher);/*将文件指针重指向文件头*
while(1)i
密文的字节数一定是8的整数倍*
fread(cipherBlock, sizeof(char), 8, cipher
DES DecryptBlock(cipherBlock, subKeys, plainBlock)
times +-8
if(times< fileLen
fwrite(plainBlock, sizeof(char), 8, plain)
/*判断末尾是否被填充米
if(plainBlock 71< 8)i
第6页
AIS加密算法c语言实现代码
for(count=8- plainBlock[7]; count< 7; count++)(
if(plainBlock[ count!='\0i
break
if( count==7){/*有填充*
fwrite(plairBlock, sizeof (char), 8- plainBlockL7, plain)
else{/*无填充
fwrite(plainBlock, sizeof(char), 8, plain)
t'close ( plain)
fclose(cipher)
return OK
int main()
clock t a, b
a= clockO
DES Encrypt( 1. txt, key. txt, 2. txt
b=clock o
printf("加密消耗%毫秒Ⅶn",b-a);
system("pause")
a= clock(
DES Decrypt( 2. txt, key. txt", 3. txt")
printf("解密消耗%毫秒、n",o-a)
getcharo
return
第7页