IDEA加密算法的C语言实现

C语言实现IDEA加密算法,要求对提供的任意的文本文件,得到一个加密的密文,谁能帮我找个这样的程序给我,要可以运行的!!

第1个回答  推荐于2016-04-23

1、数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。

2、常见加密算法
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快;
IDEA(International Data Encryption Algorithm)国际数据加密算法:使用 128 位密钥提供非常强的安全性;
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法;
BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
其它算法,如ElGamal、Deffie-Hellman、新型椭圆曲线算法ECC等。
比如说,MD5,你在一些比较正式而严格的网站下的东西一般都会有MD5值给出,如安全焦点的软件工具,每个都有MD5。

3、例程:

#include<stdio.h>
#include<process.h>
#include<conio.h>
#include<stdlib.h>
#define maxim 65537
#define fuyi 65536
#define one 65536
#define round 8
unsigned int inv(unsigned int xin);
unsigned int mul(unsigned int a,unsigned int b);
void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10]);
void key(unsigned int uskey[9],unsigned int Z[7][10]);
void de_key(unsigned int Z[7][10],unsigned int DK[7][10]);
void main()

 int i,j,k,x;
    unsigned int Z[7][10],DK[7][10],XX[5],TT[5],YY[5];
    unsigned int uskey[9];
FILE *fpout,*fpin;
printf("\n Input Key");
for(i=1;i<=8;i++)
    scanf("%6u",&uskey[i]);
for(i=0;i<9;i++)
    uskey[i]=100+i*3;
    key(uskey,Z);/*产生加密子密钥*/
    de_key(Z,DK);/*计算解密子密钥*/
    if((fpin=fopen("ekey.txt","w"))==NULL)
    {
    printf("cannot open file!");
    exit(EXIT_FAILURE);
    }
    for(i=0;i<7;i++)
    {
    for(j=0;j<10;j++)
    fprintf(fpin,"%6u",Z[i][j]);
    fprintf(fpin,"\n");
    }
    fclose(fpin);
    
    /*XX[1..5]中为明文*/
    for(i=0;i<4;i++) XX[i]=2*i+101;
    clrscr();
    printf("Ming wen %6u %6u %6u %6u \n",XX[0],XX[1],XX[2],XX[3]);
    if((fpin=(fopen("ideaming.txt","w")))==NULL)
    {printf("cannot open file!");
    exit(EXIT_FAILURE);
    }
    fprintf(fpin,"%6u,%6u,%6u,%6u \n",XX[0],XX[1],XX[2],XX[3]);
    fclose(fpin);
    for(i=1;i<=30000;i++)
    cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/
    printf("\n\n Mingwen %6u %6u %6u %6u \n",YY[0],YY[1],YY[2],YY[3]);
 if((fpin=fopen("ideamiwn.txt","w"))==NULL)
 {
 printf("cannot open file!");
    exit(EXIT_FAILURE);
    }
    fprintf(fpout,"%6u %6u %6u %6u\n",YY[0],YY[1],YY[2],YY[3]);
    {
    printf("cannot open file!");
    exit(EXIT_FAILURE);
    }
    fprintf(fpout,"%6u %6u %6u %6u \n",YY[0],YY[1],YY[2],YY[3]);
    fclose(fpout);
    for(i=1;i<=30000;i++)
    cip(YY,TT,DK);/*encipher YY to TT with Key DK*/
    printf("\n Jie Mi %6u %6u %6u %6u \n",TT[0],TT[1],TT[2],TT[3]);
    if((fpout=fopen("dideaout.txt","w"))==NULL)
    {
    printf("cannot open file!");
    exit(EXIT_FAILURE);
    }
    fprintf(fpout,"%6u %6u %6u %6u \n",TT[0],TT[1],TT[2],TT[3]);
    fclose(fpout);
    }
    /* 此函数执行IDEA算法中的加密过程*/
    
    void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10])
    {
    unsigned int r,x1,x2,x3,x4,kk,t1,t2,a;
    x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3];
    for(r=1;r<=8;r++)
    {
    /* 对64位的块进行分组运算*/
    x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]);
    x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one;
    /* MA结构的函数 */
    kk=mul(Z[5][r],(x1^x3));
    t1=mul(Z[6][r],(kk+(x2^x4))&one;
    /* 随机变换PI*/
    x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a;
    }
    /* 输出转换*/
    OUT[0]=mul(x1,Z[1][round+1]);
    OUT[3]=mul(x4,Z[1][round+1]);
    OUT[1]=(x3+Z[2][round+1])&one;
    OUT[2]=(x2+Z[3][round+1])&one;
    }
    
    /* 用高低算法上实现乘法运算*/
    unsigned int mul(unsigned int a,unsigned int b)
    {
    long int p;
    long unsigned q;
    if(a==0) p=maxim-b;
    else if(b==0) p=maxim-a;
    else
    {
    q=(unsigned long)a*(unsigned long)b;
    p=(q&one)-(q>>16);
    if(p<=0) p=p+maxim;
    {
    return (unsigned) (p&one);
    }
    
    /*通过Euclidean gcd算法计算xin的倒数*/
    unsigned int inv(unsigned int xin)
    {
    long n1,n2,q,r,b1,b2,t;
    if(xin==0)
    b2=0;
    else
    {n1=maxim;n2=xin;b2=1;b1=0;
    do{
    r=(n1%n2);q=(n1-r)/n2;
    if(r==0)
    if(b2<0) b2=maxim+b2;
    else
    {n1=n2;n2=r;
    t=b2;
    b2=b1-q*b2;b1=t;
    }
    }while(r!=0);
    }
    return (unsigned long int)b2;
    }
/*产生加密子密钥Z*/
    void key(unsigned int uskey[9],unsigned int Z[7][10])
    {
    unsigned int S[54];
    int i,j,r;
    for(i=1;i<9;i++)
    S[i-1]=uskey[i];
    /* shifts */
    for(i=8;i<54;i++)
    {
    if(i+2)%8==0)/* 对于S[14],S[22],...进行计算 */
    S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one;
    else if((i+1)%8==0)/* 对于S[15],S[23],...进行计算 */
    S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one;
    else
    S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one;
    }
    /*取得子密钥*/
    for(r=1;r<=round+1;r++)
      for(j=1;j<7;j++)
      Z[j][r]=S[6*(r-1)+j-1];
    }
    
    /* 计算解子密钥DK */
    void de_key(unsigned int Z[7][10],unsigned int DK[7][10])
    {
    int j;
    for(j=1;j<=round+1;j++)
    {DK[1][round-j+2]=inv(Z[1][j]);
    DK[4][round-j+2]=inv(Z[4][j]);
    if(i==1|j==round+1)
    {
    DK[2][round-j+2]=(fuyi-Z[2][j])&one;
    DK[3][round-j+2]=(fuyi-Z[3][j])&one;
    }
    else
    {
    DK[2][round-j+2]=inv(Z[3][j]);
    DK[3][round-j+2]=inv(Z[2][j]);
    }
    }
    for(j=1;j<=round+1;j++)
    {
    DK[5][round-j+2]=inv(Z[5][j]);
    DK[6][round-j+2]=inv(Z[6][j]);
    }
    
    }

第2个回答  推荐于2016-04-20
你可以参考一下下面:

#include<stdio.h>
#include<process.h>
#include<conio.h>
#include<stdlib.h>
#define maxim 65537
#define fuyi 65536
#define one 65536
#define round 8

unsigned int inv(unsigned int xin);
unsigned int mul(unsigned int a,unsigned int b);
void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10]);
void key(unsigned int uskey[9],unsigned int Z[7][10]);
void de_key(unsigned int Z[7][10],unsigned int DK[7][10]);

void main()
{
int i,j,k,x;
unsigned int Z[7][10],DK[7][10],XX[5],TT[5],YY[5];
unsigned int uskey[9];
FILE *fpout,*fpin;
printf("\n Input Key");
for(i=1;i<=8;i++)
scanf("%6u",&uskey[i]);
for(i=0;i<9;i++)
uskey[i]=100+i*3;
key(uskey,Z);/*产生加密子密钥*/
de_key(Z,DK);/*计算解密子密钥*/
if((fpin=fopen("ekey.txt","w"))==NULL)
{
printf("cannot open file!");
exit(EXIT_FAILURE);
}
for(i=0;i<7;i++)
{
for(j=0;j<10;j++)
fprintf(fpin,"%6u",Z[i][j]);
fprintf(fpin,"\n");
}
fclose(fpin);

/*XX[1..5]中为明文*/
for(i=0;i<4;i++) XX[i]=2*i+101;
clrscr();
printf("Ming wen %6u %6u %6u %6u \n",XX[0],XX[1],XX[2],XX[3]);
if((fpin=(fopen("ideaming.txt","w")))==NULL)
{printf("cannot open file!");
exit(EXIT_FAILURE);
}
fprintf(fpin,"%6u,%6u,%6u,%6u \n",XX[0],XX[1],XX[2],XX[3]);
fclose(fpin);
for(i=1;i<=30000;i++)
cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/
printf("\n\n Mingwen %6u %6u %6u %6u \n",YY[0],YY[1],YY[2],YY[3]);
if((fpin=fopen("ideamiwn.txt","w"))==NULL)
{
printf("cannot open file!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u %6u %6u %6u\n",YY[0],YY[1],YY[2],YY[3]);
{
printf("cannot open file!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u %6u %6u %6u \n",YY[0],YY[1],YY[2],YY[3]);
fclose(fpout);
for(i=1;i<=30000;i++)
cip(YY,TT,DK);/*encipher YY to TT with Key DK*/
printf("\n Jie Mi %6u %6u %6u %6u \n",TT[0],TT[1],TT[2],TT[3]);
if((fpout=fopen("dideaout.txt","w"))==NULL)
{
printf("cannot open file!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u %6u %6u %6u \n",TT[0],TT[1],TT[2],TT[3]);
fclose(fpout);
}
/* 此函数执行IDEA算法中的加密过程*/

void cip(unsigned int IN[4],unsigned int OUT[4],unsigned int Z[7][10])
{
unsigned int r,x1,x2,x3,x4,kk,t1,t2,a;
x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3];
for(r=1;r<=8;r++)
{
/* 对64位的块进行分组运算*/
x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]);
x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one;
/* MA结构的函数 */
kk=mul(Z[5][r],(x1^x3));
t1=mul(Z[6][r],(kk+(x2^x4))&one;
/* 随机变换PI*/
x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a;
}
/* 输出转换*/
OUT[0]=mul(x1,Z[1][round+1]);
OUT[3]=mul(x4,Z[1][round+1]);
OUT[1]=(x3+Z[2][round+1])&one;
OUT[2]=(x2+Z[3][round+1])&one;
}

/* 用高低算法上实现乘法运算*/
unsigned int mul(unsigned int a,unsigned int b)
{
long int p;
long unsigned q;
if(a==0) p=maxim-b;
else if(b==0) p=maxim-a;
else
{
q=(unsigned long)a*(unsigned long)b;
p=(q&one)-(q>>16);
if(p<=0) p=p+maxim;
{
return (unsigned) (p&one);
}

/*通过Euclidean gcd算法计算xin的倒数*/
unsigned int inv(unsigned int xin)
{
long n1,n2,q,r,b1,b2,t;
if(xin==0)
b2=0;
else
{n1=maxim;n2=xin;b2=1;b1=0;
do{
r=(n1%n2);q=(n1-r)/n2;
if(r==0)
if(b2<0) b2=maxim+b2;
else
{n1=n2;n2=r;
t=b2;
b2=b1-q*b2;b1=t;
}
}while(r!=0);
}
return (unsigned long int)b2;
}

/*产生加密子密钥Z*/
void key(unsigned int uskey[9],unsigned int Z[7][10])
{
unsigned int S[54];
int i,j,r;
for(i=1;i<9;i++)
S[i-1]=uskey[i];
/* shifts */
for(i=8;i<54;i++)
{
if(i+2)%8==0)/* 对于S[14],S[22],...进行计算 */
S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one;
else if((i+1)%8==0)/* 对于S[15],S[23],...进行计算 */
S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one;
else
S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one;
}
/*取得子密钥*/
for(r=1;r<=round+1;r++)
for(j=1;j<7;j++)
Z[j][r]=S[6*(r-1)+j-1];
}

/* 计算解子密钥DK */
void de_key(unsigned int Z[7][10],unsigned int DK[7][10])
{
int j;
for(j=1;j<=round+1;j++)
{DK[1][round-j+2]=inv(Z[1][j]);
DK[4][round-j+2]=inv(Z[4][j]);
if(i==1|j==round+1)
{
DK[2][round-j+2]=(fuyi-Z[2][j])&one;
DK[3][round-j+2]=(fuyi-Z[3][j])&one;
}
else
{
DK[2][round-j+2]=inv(Z[3][j]);
DK[3][round-j+2]=inv(Z[2][j]);
}
}
for(j=1;j<=round+1;j++)
{
DK[5][round-j+2]=inv(Z[5][j]);
DK[6][round-j+2]=inv(Z[6][j]);
}

}本回答被提问者采纳
第3个回答  2009-06-22
gogogo!

IDEA加密算法的C语言实现
2、常见加密算法DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快;IDEA(International Data Encryption Algorithm)国际数据...

Java IDEA算法
Java IDEA算法 100 求JavaIDEA算法给一个例子密钥:4245494A494E47204B554149544F4E47内容:1111111111111111结果:43A20F683C591439求高手帮忙如果有谁会C语言的话我这里有C的源码帮忙转成Java的就可以... 求Java IDEA算法 给一个例子 密钥:4245494A494E47204B554149544F4E47内容:1111111111111111结果:43A20F683C591...

关于计算机导论的问题: 为什么学习如何操作定长数字很重要?
C语言中定义数组后,系统会按定义数组大小分配空间,例如:int a 则分配10个int型大小的空间,如果定义数组为int a[ n ],n为变量,则系统不知道你需要多大的空间,所以无法分配。对一块数据用三个不同的密钥进行三次加密,强度更高; RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快; ID...

intellijidea可以写c吗
intellijidea写c教程1、通过IntelliJIDEA的插件市场,安装C\/C++插件以启用C语言支持。2、确保设置正确的C编译器和相关的工具链路径,以便IntelliJIDEA能够正确编译和构建C程序。

如何将c语言导入IntelliJ IDEA
点 Openproject 然后找到相应的项目,直接点击就可以打开了。不过之前的项目必须要是intellij idea 下的

用什么语言编程(给机器人编程用什么语言)
常见的是CFamily(C系列语言),比如:C、Cpp(C++)、CSharp(C#)、Java、Python、R、JavaScript、Objective-C、Swift、Go、Kotlin等等。然后有很多脚本语言,Python也在其内,比如:Ruby、Perl等。 光说名字意义不大,所以举几个例子。 C常用于单片机开发和一些接底层硬件的操作使用; C++是C的超集,因为直接支持了面向对象...

初识C语言:简介、环境搭建、第一个HelloWorld
编写第一个C程序“Hello, World!”的步骤包括:创建新项目、选择控制台应用、指定项目名称与位置、安装习惯的解决方案管理器位置(可放在左侧或右侧)、创建源文件、在编辑框中输入代码、运行程序。在代码中,“#include"是用于引入头文件的关键字,""是标准输入输出头文件,用于使用printf()函数输出字符...

ida系列软件有哪些
5、ida,装好插件后就可以直接反汇编为C语言,IDA PRO 简称IDA ,英文:Interactive Disassembler的缩写。ida和idea的区别表达意思不同 ideal:理想的,最佳的;想象的,不切实际的;理想;典范,完美典型。idea:想法,主意;观点,看法;原则,信念;理解,了解;猜想;目标,意图。idea 和 ideal 是两...

有哪些学习电脑编程软件电脑常用的编程软件有哪些
C++语言是具有面向对象特性的C语言的继承者。面向对象编程,或称OOP是结构化编程的下一步。OO程序由对象组成,其中的对象是数据和函数离散 *** 。有许多可用的对象库存在,这使得编程简单得只需要将一些程序“建筑材料”堆在一起(至少理论上是这样)。比如说,有很多的GUI和数据库的库实现为对象的 *** 。 C++总...

C语言IDEA_CL停止运行
修改一句代码 scanf("%d",&a);

相似回答