3des算法c语言
⑴ 常用的对称密码算法有哪些
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;
⑵ 3DES的算法介绍
3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))
⑶ IDEA加密算法的c语言实现
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>
#definemaxim65537
#definefuyi65536
#defineone65536
#defineround8
unsignedintinv(unsignedintxin);
unsignedintmul(unsignedinta,unsignedintb);
voidcip(unsignedintIN[4],unsignedintOUT[4],unsignedintZ[7][10]);
voidkey(unsignedintuskey[9],unsignedintZ[7][10]);
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10]);
voidmain()
{
inti,j,k,x;
unsignedintZ[7][10],DK[7][10],XX[5],TT[5],YY[5];
unsignedintuskey[9];
FILE*fpout,*fpin;
printf(" InputKey");
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("cannotopenfile!");
exit(EXIT_FAILURE);
}
for(i=0;i<7;i++)
{
for(j=0;j<10;j++)
fprintf(fpin,"%6u",Z[i][j]);
fprintf(fpin," ");
}
fclose(fpin);
/*XX[1..5]中为明文*/
for(i=0;i<4;i++)XX[i]=2*i+101;
clrscr();
printf("Mingwen%6u%6u%6u%6u ",XX[0],XX[1],XX[2],XX[3]);
if((fpin=(fopen("ideaming.txt","w")))==NULL)
{printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpin,"%6u,%6u,%6u,%6u ",XX[0],XX[1],XX[2],XX[3]);
fclose(fpin);
for(i=1;i<=30000;i++)
cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/
printf(" Mingwen%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
if((fpin=fopen("ideamiwn.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
fclose(fpout);
for(i=1;i<=30000;i++)
cip(YY,TT,DK);/*encipherYYtoTTwithKeyDK*/
printf(" JieMi%6u%6u%6u%6u ",TT[0],TT[1],TT[2],TT[3]);
if((fpout=fopen("dideaout.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",TT[0],TT[1],TT[2],TT[3]);
fclose(fpout);
}
/*此函数执行IDEA算法中的加密过程*/
voidcip(unsignedintIN[4],unsignedintOUT[4],unsignedintZ[7][10])
{
unsignedintr,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;
}
/*用高低算法上实现乘法运算*/
unsignedintmul(unsignedinta,unsignedintb)
{
longintp;
longunsignedq;
if(a==0)p=maxim-b;
elseif(b==0)p=maxim-a;
else
{
q=(unsignedlong)a*(unsignedlong)b;
p=(q&one)-(q>>16);
if(p<=0)p=p+maxim;
{
return(unsigned)(p&one);
}
/*通过Euclideangcd算法计算xin的倒数*/
unsignedintinv(unsignedintxin)
{
longn1,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(unsignedlongint)b2;
}
/*产生加密子密钥Z*/
voidkey(unsignedintuskey[9],unsignedintZ[7][10])
{
unsignedintS[54];
inti,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;
elseif((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*/
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10])
{
intj;
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]);
}
}
⑷ 哪位编程高手,帮我用C++编写一个完整的能运行的3DES加密算法,谢谢!
/*在TC2 和 VC6下都可以顺利运行。做了一个下午。一定要用我这个噢。有简单的输入错误检测。有完整的说明和注释*/#include<stdio.h> /*库文件包含*/#include<string.h> /*用于字符串操作*/#include<stdlib.h> /*用于exit函数*//**************************************************************************int check(char *c)输入参数: char *c: 输入的字符串返回参数: 0:字符串中有不符合规定的字符 1: 字符串字符符合规定,没有不符合规定的字符.功能: 检查字符串中有否除了 0-9, +,-,*,/,(,),之外的其他字符, 如果有,则返回0, 表示出现错误。 若没有,则返回1,表式字符串符合规定。**************************************************************************/int check(char *c){ int k=0; while(*c!='\0') { if((*c>='0' && *c<='9') || *c=='+' || *c=='-' || *c=='*' || *c=='/' || *c=='.' || *c=='(' || *c==')' ) { } else { printf("input error, there have the char not the math expression char!\n"); return 0; } if(*c=='(') k++; else if(*c==')') k--; c++; } if(k!=0) { printf("input error, there is not have correct bracket '()'!\n"); return 0; } return 1;}/**************************************************************************void move(char *f, double *s,int p) 输入参数: char *f : 运算符数组 double *s: 数值数组 int p: 当前运算符数组位置。返回参数: 无功能: 将当前已经完成运算的运算符消去,同时将数值数组的位置调整以进行下一次运算。 传入值p若为3 则当前符号的数组位置为3. f[3]=f[3+1].......f[len-2]=f[len-1] f[len-1]='\0'; s[i]=s[i+1].......s[len-1]=s[len] 因为数值比运算符多一个。***************************************************************************/void move(char *f, double *s,int p) { int i=0,len=strlen(f); for(i=p; i<len; i++) /*将已经运算过的符号,空出来的位置用后面的符号来填充,*/ { /*即把乘和除号的位置用后面的加和减号填充*/ f[i]=f[i+1]; s[i]=s[i+1]; } s[i]=s[i+1]; f[len-1]='\0';}/**************************************************************************double convnum(char *c)输入参数: char *c :由数字和小数点组成的字符,用以转换成double型的数值。返回参数: num:返回转换好的值。功能: 将输入的字符串先将其小数点以前的部分复制到temp[]数组中, 若有小数点,则将小数点之后的数值,也就是小数部分先进行计算,值存入num中 计算完成后,再对整数部分进行计算,值加上小数部分的值,存入num中。***************************************************************************/double convnum(char *c){ double num=0.0; double a=1.0; int i=0,p=0,len=0; char temp[100]; int tempi=0; int start=0; int f=1; /*正负符号指示器,若为1则为正数,为-1,此数为负数*/ len=strlen©; if(c[0]=='-') { start=1; f=-1; } for(i=start; i<len; i++) { if(c[i]=='.') { p=i; break; } temp[tempi++]=c[i]; /*将整数部分复制到temp[]中*/ } temp[tempi]='\0'; if(p!=0) { for(i=p+1;i<len;i++) /*将小数部分计算出来*/ { if(c[i]=='.') /*如果有多余的小数点,则表示输入错误*/ { printf("there is more that one dot '.' in number!error!\n"); exit(0); } a=a*0.1; num+=(a*(c[i]-48)); } } a=1.0; len=strlen(temp); /*计算整数部分*/ for(i=len-1;i>=0; i--) { num=num+(a*(temp[i]-48)); a*=10; } num=num*f; return num;}/**************************************************************************double good(char *c)输入参数: char *c :即将进行运算的字符串型数学表达式。如3.5+(2*3/5)返回参数: s[0]:计算结果将放入s[0]中功能: 将输入的字符串中的数字分别调用convnum(char *c)函数进行数值变换,再将其依 次存入doulbe s[i]中,将加减乘除运算符依次存入字符串符号数组 char f[i]中, 然后如果遇到括号,则将括号内的字符串存入另一字符数组中,然后用此 good(char *c) 递归函数进行递归运算。 然后根据先乘除,后加减的顺序对已 存入数组的数值根 据存入字符串符号数组的运算符进行运算。结果存入s[0]中。 返回最终结果。***************************************************************************/double good(char *c) /*可递归函数*/{ /*取得数值字符串,并调用convnum转换成double*/ char g[100],number[30]; /*g,保存当前的表达式串,number保存一个数的所有字符*/ char f[80]; /*保存所有的符号的堆栈*/ int fi=0; /*保存符号的位置指针*/ double s[80]; /*保存当前所有的数的一个堆栈*/ int si=0; /*保存数字位置指针*/ int k=0; /* 若k=1则表示有一对括号*/ int num=0,i=0; /*num保存新括号内的字符数,i 保存number里的字符位置*/ int cc=0; /*乘除符号数量*/ int jj=0; /*加减符号数量*/ while(*c!='\0')/*当p==1 和k==0时,表示已经把括号里的内容全部复制到g[100]中了*/ { k=0; num=0; switch(*c) { case '+': /*当前字符为+-乘除时则表示*/ case '-': case '*': case'/': f[fi++]=*c; if(*c=='*' || *c=='/') cc++; else jj++; if(*(c-1)!=')') { number[i]='\0'; i=0;/*完成一个数字的复制,其位置指针i=0*/ s[si++]=convnum(number); } break; case'(': /*有括号,则将当前括号作用范围内的全部字符保存,作为*/ k++; /*一个新的字符表达式进行递归调用good函数计算。*/ while(k>0) { c++; g[num]=*c; num++; if(*c==')') { k--; } else if(*c=='(') { k++; } } g[num-1]='\0'; num=0;/*完成一个括号内容的复制,其位置指针num=0*/ s[si++]=good(g); break; default: number[i++]=*c; if(*(c+1)=='\0') { number[i]='\0'; s[si++]=convnum(number); } break; } c++; } f[fi]='\0'; i=0; while(cc>0) { switch(f[i]) { case '*': cc--; s[i+1]=s[i]*s[i+1]; move(f,s,i); break; case '/': cc--; s[i+1]=s[i]/(float)s[i+1]; move(f,s,i); break; default: i++; break; } } i=0; while(jj>0) { switch(f[i]) { case '+': s[i+1]=s[i]+s[i+1]; jj--; move(f,s,i); break; case '-': s[i+1]=s[i]-s[i+1]; jj--; move(f,s,i); break; default: printf("operator error!"); break; } } return s[0];}void main(){ char str[100]; double sum=0; int p=1; while(1) { printf("enter expression: enter 'exit' end of program\n"); scanf("%s",str); p=strcmp(str,"exit"); if(p==0) break; p=check(str); if(p==0) continue; sum=good(str); printf("%s=%f",str,sum); printf("\n"); } printf("good bye!\n");}例:enter expression: enter 'exit' end of program3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6(输入)3.5+(12.3*15+8-(3/2+1))*2+(3.2*3-5)/6=384.266667enter expression: enter 'exit' end of programchina(输入)input error, there have the char not the math expression char!enter expression: enter 'exit' end of programexit(输入)good bye!
如果你还有什么不懂的,可以网络搜下:编程回忆录,他们现在正在录制这方面的教程,都是零基础开始,由浅入深。
⑸ 如何用C实现3DES算法..
3DES算法C语言实现,有注释! http://tech.cuit.e.cn/forum/thread-2448-1-1.html
⑹ 什么是3DES对称加密算法
DES加密经过下面的步骤
1、提供明文和密钥,将明文按照64bit分块(对应8个字节),不足8个字节的可以进行填充(填充方式多种),密钥必须为8个字节共64bit
填充方式:
当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。
* NoPadding
API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim
* PKCS5Padding
加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8
解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。
例如:加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。
* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。
2、选择加密模式
**ECB模式** 全称Electronic Codebook模式,译为电子密码本模式
**CBC模式** 全称Cipher Block Chaining模式,译为密文分组链接模式
**CFB模式** 全称Cipher FeedBack模式,译为密文反馈模式
**OFB模式** 全称Output Feedback模式,译为输出反馈模式。
**CTR模式** 全称Counter模式,译为计数器模式。
3、开始加密明文(内部原理--加密步骤,加密算法实现不做讲解)
image
1、将分块的64bit一组组加密,示列其中一组:将此组进行初始置换(IP置换),目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。
2、开始Feistel结构的16次转换,第一次转换为:右侧数据R0和子密钥经过轮函数f生成用于加密左侧数据的比特序列,与左侧数据L0异或运算,
运算结果输出为加密后的左侧L0,右侧数据则直接输出为右侧R0。由于一次Feistel轮并不会加密右侧,因此需要将上一轮输出后的左右两侧对调后才正式完成一次Feistel加密,
3、DES算法共计进行16次Feistel轮,最后一轮输出后左右两侧无需对调,每次加密的子密钥不相同,子密钥是通过秘钥计算得到的。
4、末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入
DES解密经过下面的步骤
1、拿到密文和加密的密钥
2、解密:DES加密和解密的过程一致,均使用Feistel网络实现,区别仅在于解密时,密文作为输入,并逆序使用子密钥。
3、讲解密后的明文去填充 (padding)得到的即为明文
Golang实现DES加密解密
package main
import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)
func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最后5位是补码
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明码
fmt.Printf("%s",txt) // hello world
}
// 加密函数
func DESEncode(orignData, key []byte)([]byte,error){
// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}
// 明文分组,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())
// 设定加密模式,为了方便,初始向量直接使用key充当了(实际项目中,最好别这么做)
blockMode := cipher.NewCBCEncrypter(block,key)
// 创建密文长度的切片,用来存放密文字节
crypted :=make([]byte,len(txt))
// 开始加密,将txt作为源,crypted作为目的切片输入
blockMode.CryptBlocks(crypted,txt)
// 将加密后的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函数
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}
// 设置解密模式,加密模式和解密模式要一样
blockMode := cipher.NewCBCDecrypter(block,key)
// 设置切片长度,用来存放明文字节
originData := make([]byte,len(cripter))
// 使用解密模式解密,将解密后的明文字节放入originData 切片中
blockMode.CryptBlocks(originData,cripter)
// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)
return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 获取最后一位转为整型,然后根据这个整型截取掉整型数量的长度
// 若此数为5,则减掉转换明文后的最后5位,即为我们输入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在设置加密模式为CBC的时候,我们需要设置一个初始化向量,这个量的意思 在对称加密算法中,如果只有一个密钥来加密数据的话,明文中的相同文字就会也会被加密成相同的密文,这样密文和明文就有完全相同的结构,容易破解,如果给一个初始化向量,第一个明文使用初始化向量混合并加密,第二个明文用第一个明文的加密后的密文与第二个明文混合加密,这样加密出来的密文的结构则完全与明文不同,更加安全可靠。CBC模式图如下
CBC
3DES
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
对比DES,发现只是换了NewTripleDESCipher。不过,需要注意的是,密钥长度必须24byte,否则直接返回错误。关于这一点,PHP中却不是这样的,只要是8byte以上就行;而Java中,要求必须是24byte以上,内部会取前24byte(相当于就是24byte)。另外,初始化向量长度是8byte(目前各个语言都是如此,不是8byte会有问题)
⑺ 对称加密算法的加密算法主要有哪些
1、3DES算法
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
3DES解密过程为:M=Dk1(EK2(Dk3(C)))
2、Blowfish算法
BlowFish算法用来加密64Bit长度的字符串。
BlowFish算法使用两个“盒”——unsignedlongpbox[18]和unsignedlongsbox[4,256]。
BlowFish算法中,有一个核心加密函数:BF_En(后文详细介绍)。该函数输入64位信息,运算后,以64位密文的形式输出。用BlowFish算法加密信息,需要两个过程:密钥预处理和信息加密。
分别说明如下:
密钥预处理:
BlowFish算法的源密钥——pbox和sbox是固定的。我们要加密一个信息,需要自己选择一个key,用这个key对pbox和sbox进行变换,得到下一步信息加密所要用的key_pbox和key_sbox。具体的变化算法如下:
1)用sbox填充key_sbox
2)用自己选择的key8个一组地去异或pbox,用异或的结果填充key_pbox。key可以循环使用。
比如说:选的key是"abcdefghijklmn"。则异或过程为:
key_pbox[0]=pbox[0]abcdefgh;
key_pbox[1]=pbox[1]ijklmnab;
…………
…………
如此循环,直到key_pbox填充完毕。
3)用BF_En加密一个全0的64位信息,用输出的结果替换key_pbox[0]和key_pbox[1],i=0;
4)用BF_En加密替换后的key_pbox,key_pbox[i+1],用输出替代key_pbox[i+2]和key_pbox[i+3];
5)i+2,继续第4步,直到key_pbox全部被替换;
6)用key_pbox[16]和key_pbox[17]做首次输入(相当于上面的全0的输入),用类似的方法,替换key_sbox信息加密。
信息加密就是用函数把待加密信息x分成32位的两部分:xL,xRBF_En对输入信息进行变换。
3、RC5算法
RC5是种比较新的算法,Rivest设计了RC5的一种特殊的实现方式,因此RC5算法有一个面向字的结构:RC5-w/r/b,这里w是字长其值可以是16、32或64对于不同的字长明文和密文块的分组长度为2w位,r是加密轮数,b是密钥字节长度。
(7)3des算法c语言扩展阅读:
普遍而言,有3个独立密钥的3DES(密钥选项1)的密钥长度为168位(三个56位的DES密钥),但由于中途相遇攻击,它的有效安全性仅为112位。密钥选项2将密钥长度缩短到了112位,但该选项对特定的选择明文攻击和已知明文攻击的强度较弱,因此NIST认定它只有80位的安全性。
对密钥选项1的已知最佳攻击需要约2组已知明文,2部,2次DES加密以及2位内存(该论文提到了时间和内存的其它分配方案)。
这在现在是不现实的,因此NIST认为密钥选项1可以使用到2030年。若攻击者试图在一些可能的(而不是全部的)密钥中找到正确的,有一种在内存效率上较高的攻击方法可以用每个密钥对应的少数选择明文和约2次加密操作找到2个目标密钥中的一个。
⑻ 2.2 DES/3DES算法 -- 算法介绍
DES 算法和 DESSede 算法统称DES系列算法,是对称加密算法领域的经典加密算法。 DESSede (又称 3DES )使用三次迭代增加算法安全性。DES算法是众多对称加密算法的基础,很多算法都是基于该算法演变而来。
虽然DES被取代了,但是DES的CBC工作模式是基础性的算法和工作模型,有很强的意义,在遗留系统中也有一些使用的。
DES的算法是采用分组加密工作模式,流程比较复杂,大致流程如下:
DES 和 3DES 适合一般加密性场景,当前大部分是遗留系统在使用,还有一部分可能是系统没有支持 AES 等其他加密手段被迫使用。
JDK仅支持 56位的密钥长度 (出口限制),对称加密系列算法的特点是:密钥长度越高安全性越高,因此JDK本身自带的 DES 和 3DES 算法仅适合学术和一般场景使用,Bouncy Castle提供了64位密钥长度的支持。
3DES 是对 DES 的一种改良算法,针对 DES 算法密钥短,迭代次数少的缺点做了改进。但是 3DES 算法速度慢,密钥计算时间长,加密效率不高,实际使用也不多。
DES 的 3 大安全痛点: