📄 idea.c
字号:
/**********************************************************************
* idea.c
*
* Author : Sunflower
* CopyRight 2001 DATech
*
* 得安公司第二代加密卡idea运算程序。包括密钥生成、加解密
**********************************************************************/
#include <stdlib.h>
#include <memory.h>
#include <stdio.h>
#include <conio.h>
#include "armtypes.h"
#include "idea.h"
ARM_RV test_IdeaEcb_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen);
ARM_RV test_IdeaCbc_Block(ARM_UINT8 *pbIdeaKey, ARM_UINT32 ulIdeaKeyLen);
void ideaCipher(ARM_UINT8 *inbuf, ARM_UINT8 *outbuf, ARM_UINT16 *key)
{
register ARM_UINT16 x1,x2,x3,x4,s2,s3;
register ARM_UINT16 t16;
register ARM_UINT32 t32;
int r = IDEAROUNDS;
x1 = (ARM_UINT16)(inbuf[0] << 8 | inbuf[1]);
x2 = (ARM_UINT16)(inbuf[2] << 8 | inbuf[3]);
x3 = (ARM_UINT16)(inbuf[4] << 8 | inbuf[5]);
x4 = (ARM_UINT16)(inbuf[6] << 8 | inbuf[7]);
do {
MUL(x1,*key++);
x2 = (unsigned short)(x2 + *key++);
x3 = (unsigned short)(x3 + *key++);
MUL(x4, *key++);
s3 = x3;
x3 ^= x1;
MUL(x3, *key++);
s2 = x2;
x2 ^= x4;
x2 = (unsigned short)(x2 + x3);
MUL(x2, *key++);
x3 = (unsigned short)(x2 + x3);
x1 ^= x2; x4 ^= x3;
x2 ^= s3; x3 ^= s2;
} while (--r);
MUL(x1, *key++);
x3 = (unsigned short)(x3 + *key++);
x2 = (unsigned short)(x2 + *key++);
MUL(x4, *key);
outbuf[0] = (ARM_UINT8)(x1>>8);
outbuf[1] = (ARM_UINT8)x1;
outbuf[2] = (ARM_UINT8)(x3>>8);
outbuf[3] = (ARM_UINT8)x3;
outbuf[4] = (ARM_UINT8)(x2>>8);
outbuf[5] = (ARM_UINT8)x2;
outbuf[6] = (ARM_UINT8)(x4>>8);
outbuf[7] = (ARM_UINT8)x4;
}
void idea_enc(ARM_IDEA_CTX *c, ARM_UINT8 *data,int blocks)
{
int i;
unsigned char *d = data;
for ( i = 0; i < blocks; i ++)
{
ideaCipher(d,d,c->ek);
d += 8;
}
}
void idea_dec(ARM_IDEA_CTX *c, ARM_UINT8 *data,int blocks)
{
int i;
unsigned char *d = data;
for ( i = 0; i < blocks; i ++)
{
ideaCipher(d,d,c->dk);
d += 8;
}
}
ARM_UINT16 mulInv(ARM_UINT16 x)
{
ARM_UINT16 t0,t1;
ARM_UINT16 q,y;
if (x<=1)
return x;
t1=(unsigned short)(0x10001l/x);
y=(unsigned short)(0x10001l%x);
if (y==1)
return (ARM_UINT16)low16(1-t1);
t0=1;
do
{
q=(unsigned short)(x/y);
x=(unsigned short)(x%y);
t0=(unsigned short)(t0 + q*t1);
if (x==1)
return t0;
q=(unsigned short)(y/x);
y=(unsigned short)(y%x);
t1=(unsigned short)(t1 + q*t0);
}while (y != 1);
return (ARM_UINT16)low16(1-t1);
}
ARM_RV ideaExpandKey(ARM_UINT8 const *userkey, ARM_UINT32 userkeyLen,
ARM_UINT16 *EK, ARM_UINT32 *EKbytes)
{
int i,j;
if (userkeyLen != 16)
return ARMERR_PARAM;
for (j=0;j<8;j++)
{
EK[j]=(unsigned short)((userkey[0]<<8 )+ userkey[1]);
userkey +=2;
}
for (i=0;j<IDEAKEYLEN;j++)
{
i++;
EK[i+7] = (unsigned short)(EK[i & 7] <<9 | EK[(i+1) & 7]>> 7);
EK += i & 8;
i &= 7;
}
*EKbytes = IDEAKEYLEN * 2; // 1 short = 2 bytes;
return ARMERR_SUCCESS;
}
ARM_RV ideaInvertKey(ARM_UINT16 const *EK, ARM_UINT32 ekBytes,
ARM_UINT16 DK[IDEAKEYLEN], ARM_UINT32 *dkBytes)
{
int i;
ARM_UINT16 t1,t2,t3;
ARM_UINT16 temp[IDEAKEYLEN];
ARM_UINT16 *p=temp+IDEAKEYLEN;
if (ekBytes != IDEAKEYBYTES)
return ARMERR_PARAM;
t1 = mulInv(*EK++);
t2 = (unsigned short)-*EK++;
t3 = (unsigned short)-*EK++;
*--p = mulInv(*EK++);
*--p = t3;
*--p = t2;
*--p = t1;
for (i =0;i< IDEAROUNDS-1;i++){
t1 = *EK++;
*--p = *EK++;
*--p = t1;
t1 = mulInv(*EK++);
t2 = (unsigned short)-*EK++;
t3 = (unsigned short)-*EK++;
*--p = mulInv(*EK++);
*--p = t2;
*--p = t3;
*--p = t1;
}
t1 = *EK++;
*--p = *EK++;
*--p = t1;
t1 = mulInv(*EK++);
t2 = (unsigned short)-*EK++;
t3 = (unsigned short)-*EK++;
*--p = mulInv(*EK++);
*--p = t3;
*--p = t2;
*--p = t1;
memcpy(DK,temp,sizeof(temp));
for(i = 0; i < IDEAKEYLEN; i++)
temp[i] = 0;
*dkBytes = IDEAKEYLEN * 2;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaExpandEncKey : Expand Idea Enc Key 扩展idea加密密钥
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
pbIdeaKey : 扩展前的IDEA密钥(8字节) input
ulIdeaKeyLen : 扩展前的IDEA密钥长度 input
pbIdeaEncKey : 扩展后的IDEA加密密钥(128字节) output
*ulIdeaEncKeyLen : 扩展后的IDEA加密密钥长度 output
*****************************************************************/
ARM_RV Arm_IdeaExpandEncKey(
ARM_UINT8 *pbIdeaKey,
ARM_UINT32 ulIdeaKeyLen,
ARM_UINT8 *pbIdeaEncKey,
ARM_UINT32 *ulIdeaEncKeyLen)
{
ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, (ARM_UINT16*)pbIdeaEncKey, ulIdeaEncKeyLen);
if (*ulIdeaEncKeyLen != IDEAKEYLEN)
return ARMERR_GENERIC_ERROR;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaExpandDecKey : Expand Idea Dec Key 扩展idea加密密钥
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
pbIdeaKey : 扩展前的IDEA密钥(8字节) input
ulIdeaKeyLen : 扩展前的IDEA密钥长度 input
pbIdeaEncKey : 扩展后的IDEA解密密钥(128字节) output
*ulIdeaEncKeyLen : 扩展后的IDEA解密密钥长度 output
*****************************************************************/
ARM_RV Arm_IdeaExpandDecKey(
ARM_UINT8 *pbIdeaKey,
ARM_UINT32 ulIdeaKeyLen,
ARM_UINT8 *pbIdeaDecKey,
ARM_UINT32 *ulIdeaDecKeyLen)
{
ARM_UINT16 pbIdeaEncKey[IDEAKEYLEN];
ARM_UINT32 ulIdeaEncKeyLen;
ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, pbIdeaEncKey, &ulIdeaEncKeyLen);
ideaInvertKey(pbIdeaEncKey, ulIdeaEncKeyLen, (ARM_UINT16*)pbIdeaDecKey, ulIdeaDecKeyLen);
*ulIdeaDecKeyLen = ulIdeaEncKeyLen;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaEncRaw : Idea算法加密小整块明文8字节
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
pbIdeaEncKey : IDEA加密密钥 input
ulIdeaEncKeyLen : IDEA加密密钥长度 input
pbInData : 待加密的明文 input
ulInDataLen : 待加密的明文长度 input
pbOutData : 加密后的密文 output
*ulOutDataLen : 加密后的密文长度 output
*****************************************************************/
ARM_RV Arm_IdeaEncRaw(
ARM_UINT8 *pbIdeaEncKey,
ARM_UINT32 ulIdeaEncKeyLen,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
if ((ulIdeaEncKeyLen != IDEAKEYBYTES) || (ulInDataLen != IDEABLOCKBYTES))
return ARMERR_PARAM;
ideaCipher(pbInData, pbOutData, (ARM_UINT16*)pbIdeaEncKey);
*ulOutDataLen = IDEABLOCKBYTES;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaDecRaw : Idea算法解密小整块密文8字节
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
pbIdeaDecKey : IDEA解密密钥 input
ulIdeaDecKeyLen : IDEA解密密钥长度 input
pbInData : 待解密的密文 input
ulInDataLen : 待解密的密文长度 input
pbOutData : 解密后的明文 output
*ulOutDataLen : 解密后的明文长度 output
*****************************************************************/
ARM_RV Arm_IdeaDecRaw(
ARM_UINT8 *pbIdeaDecKey,
ARM_UINT32 ulIdeaDecKeyLen,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
if ((ulIdeaDecKeyLen != IDEAKEYBYTES) || (ulInDataLen != IDEABLOCKBYTES))
return ARMERR_PARAM;
ideaCipher(pbInData, pbOutData, (ARM_UINT16*)pbIdeaDecKey);
*ulOutDataLen = IDEABLOCKBYTES;
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaEncEcbInitialize: Idea算法Ecb模式加密初始化(扩展加密密钥)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA密钥,包含加密密钥 output
pbIdeaKey : IDEA扩展前的密钥 input
ulIdeaKeyLen : IDEA扩展前的密钥长度字节数(=8)input
*****************************************************************/
ARM_RV Arm_IdeaEncEcbInitialize(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbIdeaKey,
ARM_UINT32 ulIdeaKeyLen)
{
ideaExpandKey(pbIdeaKey, ulIdeaKeyLen, ideaCtx->ek, &(ideaCtx->ekBytes));
return ARMERR_SUCCESS;
}
/*****************************************************************
Arm_IdeaEncEcbUpdate : Idea算法Ecb模式加密小整块密文8字节(update)
Return value:
ARMERR_SUCCESS : Success
other : failed
Parameters:
ideaCtx : IDEA密钥 input
pbInData : 待加密的明密文 input
ulInDataLen : 待加密的明文长度 input
pbOutData : 加密后的密文 output
*ulOutDataLen : 加密后的密文长度 output
*****************************************************************/
ARM_RV Arm_IdeaEncEcbUpdate(
ARM_IDEA_CTX *ideaCtx,
ARM_UINT8 *pbInData,
ARM_UINT32 ulInDataLen,
ARM_UINT8 *pbOutData,
ARM_UINT32 *ulOutDataLen)
{
if (ulInDataLen != IDEABLOCKBYTES)
return ARMERR_PARAM;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -