求一个用c语言写的DES加密算法~~

Python045

求一个用c语言写的DES加密算法~~,第1张

using system

using system.security.cryptography

using system.io

using system.text

public class encryptstringdes {

public static void main(string)

return

}

// 使用utf8函数加密输入参数

utf8encoding utf8encoding = new utf8encoding()

byte.tochararray())

// 方式一:调用默认的des实现方法des_csp.

des des = des.create()

// 方式二:直接使用des_csp()实现des的实体

//des_csp des = new des_csp()

// 初始化des加密的密钥和一个随机的、8比特的初始化向量(iv)

byte iv = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef}

des.key = key

des.iv = iv

// 建立加密流

symmetricstreamencryptor sse = des.createencryptor()

// 使用cryptomemorystream方法获取加密过程的输出

cryptomemorystream cms = new cryptomemorystream()

// 将symmetricstreamencryptor流中的加密数据输出到cryptomemorystream中

sse.setsink(cms)

// 加密完毕,将结果输出到控制台

sse.write(inputbytearray)

sse.closestream()

// 获取加密数据

byte)

}

console.writeline()

//上面演示了如何进行加密,下面演示如何进行解密

symmetricstreamdecryptor ssd = des.createdecryptor()

cms = new cryptomemorystream()

ssd.setsink(cms)

ssd.write(encrypteddata)

ssd.closestream()

byte decryptedchararray = utf8encoding.getchars(decrypteddata)

console.writeline("解密后数据:")

console.write(decryptedchararray)

console.writeline()

}

}

编译:

d:\csharp>csc des_demo.cs

microsoft (r) c# compiler version 7.00.8905

copyright (c) microsoft corp 2000. all rights reserved.

运行实例:

d:\csharp>des_demo.exe 使用c#编写des加密程序的framework

加密结果:

3d 22 64 c6 57 d1 c4 c3 cf 77 ce 2f d0 e1 78 2a 4d ed 7a a8 83 f9 0e 14 e1 ba 38

7b 06 41 8d b5 e9 3f 00 0d c3 28 d1 f9 6d 17 4b 6e a7 41 68 40

可能很长 ,这是在我以前一个程序里摘出来的。 原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的 ASCII码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的asc

#include<iostream.h>

class SubKey{ //定义子密钥为一个类

public:

int key[8][6]

}subkey[16] //定义子密钥对象数组

class DES{

int encipher_decipher //判断加密还是解密

int key_in[8][8]//用户原始输入的64位二进制数

int key_out[8][7] //除去每行的最后一位校验位

int c0_d0[8][7] //存储经PC-1转换后的56位数据

int c0[4][7],d0[4][7] //分别存储c0,d0

int text[8][8] //64位明文

int text_ip[8][8] //经IP转换过后的明文

int A[4][8],B[4][8] //A,B分别存储经IP转换过后明文的两部分,便于交换

int temp[8][6] //存储经扩展置换后的48位二进制值

int temp1[8][6] //存储和子密钥异或后的结果

int s_result[8][4] //存储经S变换后的32位值

int text_p[8][4]//经P置换后的32位结果

int secret_ip[8][8] //经逆IP转换后的密文

public:

void Key_Putting()

void PC_1()

int function(int,int) //异或

void SubKey_Production()

void IP_Convert()

void f()

void _IP_Convert()

void Out_secret()

}

void DES::Key_Putting() //得到密钥中对算法有用的56位

{

cout<<"请输入64位的密钥(8行8列且每行都得有奇数个1):\n"

for(int i=0i<8i++)

for(int j=0j<8j++){

cin>>key_in[i][j]

if(j!=7) key_out[i][j]=key_in[i][j]

}

}

void DES::PC_1() //PC-1置换函数

{

int pc_1[8][7]={ //PC-1

{57, 49, 41, 33, 25, 17, 9},

{1, 58, 50, 42, 34, 26, 18},

{10, 2, 59, 51, 43, 35, 27},

{19, 11, 3, 60, 52, 44, 36},

{63, 55, 47, 39, 31, 23, 15},

{7, 62, 54, 46, 38, 30, 22},

{14, 6, 61, 53, 45, 37, 29},

{21, 13, 5, 28, 20, 12, 4}

}

int i,j

for(i=0i<8i++)

for(j=0j<7j++)

c0_d0[i][j]=key_out[ (pc_1[i][j]-1)/8 ][ (pc_1[i][j]-1)%8 ]

}

int DES::function(int a,int b)//模拟二进制数的异或运算,a和b为整型的0和1,返回值为整型的0或1

{

if(a!=b)return 1

else return 0

}

void DES::SubKey_Production()//生成子密钥

{

int move[16][2]={ //循环左移的位数

1 , 1 , 2 , 1 ,

3 , 2 , 4 , 2 ,

5 , 2 , 6 , 2 ,

7 , 2 , 8 , 2 ,

9 , 1, 10 , 2,

11 , 2, 12 , 2,

13 , 2, 14 , 2,

15 , 2, 16 , 1

}

int pc_2[8][6]={ //PC-2

14, 17 ,11 ,24 , 1 , 5,

3 ,28 ,15 , 6 ,21 ,10,

23, 19, 12, 4, 26, 8,

16, 7, 27, 20 ,13 , 2,

41, 52, 31, 37, 47, 55,

30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53,

46, 42, 50, 36, 29, 32

}

for(int i=0i<16i++) //生成子密钥

{

int j,k

int a[2],b[2]

int bb[28],cc[28]

for(j=0j<4j++)

for(k=0k<7k++)

c0[j][k]=c0_d0[j][k]

for(j=4j<8j++)

for(k=0k<7k++)

d0[j-4][k]=c0_d0[j][k]

for(j=0j<4j++)

for(k=0k<7k++){

bb[7*j+k]=c0[j][k]

cc[7*j+k]=d0[j][k]

}

for(j=0j<move[i][1]j++){

a[j]=bb[j]

b[j]=cc[j]

}

for(j=0j<28-move[i][1]j++){

bb[j]=bb[j+1]

cc[j]=cc[j+1]

}

for(j=0j<move[i][1]j++){

bb[27-j]=a[j]

cc[27-j]=b[j]

}

for(j=0j<28j++){

c0[j/7][j%7]=bb[j]

d0[j/7][j%7]=cc[j]

}

for(j=0j<4j++) //L123--L128是把c0,d0合并成c0_d0

for(k=0k<7k++)

c0_d0[j][k]=c0[j][k]

for(j=4j<8j++)

for(k=0k<7k++)

c0_d0[j][k]=d0[j-4][k]

for(j=0j<8j++) //对Ci,Di进行PC-2置换

for(k=0k<6k++)

subkey[i].key[j][k]=c0_d0[ (pc_2[j][k]-1)/7 ][ (pc_2[j][k]-1)%7 ]

}

}

void DES::IP_Convert()

{

int IP[8][8]={ //初始置换IP矩阵

58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6,

64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1,

59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5,

63, 55, 47, 39, 31, 23, 15, 7

}

cout<<"你好,你要加密还是解密?加密请按1号键(输入1),解密请按2号键,并确定."<<'\n'

cin>>encipher_decipher

char * s

if(encipher_decipher==1) s="明文"

else s="密文"

cout<<"请输入64位"<<s<<"(二进制):\n"

int i,j

for(i=0i<8i++)

for(j=0j<8j++)

cin>>text[i][j]

for(i=0i<8i++) //进行IP变换

for(j=0j<8j++)

text_ip[i][j]=text[ (IP[i][j]-1)/8 ][ (IP[i][j]-1)%8 ]

}