DES加密解密算法

DES加密解密算法

// 仿射变换加解密.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <conio.h>

static char key[10], key_a[5], code[8], key_b[5], temp[10], key_aa[8], key_bb[8], l[4], r[4], l_a[4], r_a[4], V[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }, b[8];
char Code, CCode[100];
int p_a[10] = { 3, 5, 2, 7, 4, 10, 1, 9, 8, 6 };
int p_b[8] = { 6, 3, 7, 4, 8, 5, 10, 9 };
int S_a[4][4] = { 1, 0, 2, 3, 3, 2, 1, 0, 0, 2, 1, 3, 3, 1, 3, 2 };
int S_b[4][4] = { 0, 1, 2, 3, 2, 0, 1, 3, 3, 0, 1, 0, 2, 1, 0, 3 };
int IP_a[8] = { 2, 6, 3, 1, 4, 8, 5, 7 }, IP_b[8] = { 4, 1, 3, 5, 7, 2, 8, 6 };
int F_E[8] = { 4, 1, 2, 3, 2, 3, 4, 1 };
void C_code(char);
void coder(char a[10]);
void decoder(char a[10]);
void Sub_Key_Product(char a[10]);
void box(char a[4], int b[4][4]);
char XOR(char, char);
char ReCode(char a[8]);
void C_code_b(char);
void get_key();
void Coder(char a[100], char v[8]);
void Decoder(char a[100], char v[8]);
/**************************************************************************/
 int main()
{
    //int i;
    while (getchar() != ‘e‘)
    {
        //clrscr();
        printf("Please Enter The Text You Want to Code:\n");
        scanf("%s", CCode);
        Coder(CCode, V);
        printf("%s", CCode);
        printf("\n");
        Decoder(CCode, V);
        printf("%s", CCode);
    }
}
void Coder(char a[100], char v[8])           /*Make the text into coder*/
{
    int i, j;
    get_key();
    C_code(a[0]);
    for (i = 0; i<8; i++)
        code[i] = XOR(code[i], v[i]);
    Code = ReCode(code);
    coder(key);
    a[0] = Code;
    for (j = 1; j<100; j++)
    {
        C_code_b(a[j - 1]);
        C_code(a[j]);
        for (i = 0; i<8; i++)
            code[i] = XOR(code[i], b[i]);
        Code = ReCode(code);
        coder(key);
        a[j] = Code;
    }
}
void get_key()             /*Give the key to the computer*/
{
    int i;
    getch();
    printf("Please enter the key:");
    scanf("%s", key);
    for (i = 0; i<10; i++)
        key[i] -= 48;
}
void C_code_b(char m)          /*Make the number into binary */
{
    char i = 1, n = 64;
    if (m<0)
    {
        b[0] = 1;
        m = m + 128;
    }
    else
        b[0] = 0;
    while (i<8)
    {
        b[i] = m / n;
        m = m - n*b[i];
        n = n / 2;
        i++;
    }
}
void C_code(char m)
{
    char i = 1, n = 64;
    if (m<0)
    {
        code[0] = 1;
        m = m + 128;
    }
    else
        code[0] = 0;
    while (i<8)
    {
        code[i] = m / n;
        m = m - n*code[i];
        n = n / 2;
        i++;
    }
}
char XOR(char a, char b)
{
    if (a == b)
        return 0;
    else return 1;
}
char ReCode(char a[8])
{
    int i;
    for (i = 0; i<7; i++)
        a[i + 1] = 2 * a[i] + a[i + 1];
    return a[7];
}
void box(char a[4], int b[4][4])
{
    int t;
    t = b[a[0] * 2 + a[3]][a[1] * 2 + a[2]];
    temp[6] = t / 2;
    temp[7] = t % 2;
}
void Sub_Key_Product(char a[10])                /*Product the key word*/
{
    int i;
    for (i = 0; i<10; i++)
        temp[i] = a[p_a[i] - 1];/* m1 */
    for (i = 0; i<5; i++)
    {
        key_a[i] = temp[(i + 1) % 5];
        key_b[i] = temp[(i + 1) % 5 + 5];
    }
    i = 0;
    while (i<5)
    {
        temp[i] = key_a[i];
        i++;
    }
    while (i<10)
    {
        temp[i] = key_b[i - 5];
        i++;
    }/* m2 */
    for (i = 0; i<8; i++)
        key_aa[i] = temp[p_b[i] - 1];/* k1 */
    for (i = 0; i<5; i++)

    {
        key_a[i] = temp[(i + 2) % 5];
        key_b[i] = temp[(i + 2) % 5 + 5];
    } /* m2 移位 */
    i = 0;
    while (i<5)
    {
        temp[i] = key_a[i];
        i++;
    }
    while (i<10)
    {
        temp[i] = key_b[i - 5];
        i++;
    } /* m3 */
    for (i = 0; i<8; i++)
        key_bb[i] = temp[p_b[i] - 1];/* k2  */
}
void IP()
{
    int i;
    for (i = 0; i<8; i++)
        temp[i] = code[IP_a[i] - 1];
    for (i = 0; i<8; i++)
        code[i] = temp[i];
}
void de_IP()
{
    int i;
    for (i = 0; i<8; i++)
        temp[i] = code[IP_b[i] - 1];
    for (i = 0; i<8; i++)
        code[i] = temp[i];
}
void fk(char c_key[8])
{
    int i;
    for (i = 0; i<4; i++)
    {
        l[i] = code[i];
        r[i] = code[i + 4];
    }
    for (i = 0; i<8; i++)
        temp[i] = XOR(r[F_E[i] - 1], c_key[i]);/* 与key异或 */
    for (i = 0; i<4; i++)
    {
        l_a[i] = temp[i];
        r_a[i] = temp[i + 4];
    }
    box(l_a, S_a);/* S0 */
    temp[4] = temp[6];
    temp[5] = temp[7];
    box(r_a, S_b);/* S1 */
    temp[0] = temp[5];
    temp[1] = temp[7];
    temp[2] = temp[6];
    temp[3] = temp[4];/* P4 */
    for (i = 0; i<4; i++)
        l[i] = XOR(temp[i], l[i]);
    i = 0;
    while (i<4)
    {
        code[i] = l[i];
        i++;
    }
    while (i<8)
    {
        code[i] = r[i - 4];
        i++;
    }/* 合并 */
}
void SW()
{
    int i = 0;
    while (i<4)
    {
        code[i] = r[i];
        i++;
    }
    while (i<8)
    {
        code[i] = l[i - 4];
        i++;
    }/* SW */
}
void coder(char a[10])
{
    C_code(Code);
    IP();
    Sub_Key_Product(a);
    fk(key_aa);
    SW();
    fk(key_bb);
    de_IP();
    Code = ReCode(code);

}
void decoder(char a[10])
{
    C_code(Code);
    IP();
    Sub_Key_Product(a);
    fk(key_bb);
    SW();
    fk(key_aa);
    de_IP();
    Code = ReCode(code);

}
void Decoder(char a[100], char v[8])         /*Make the coder into text*/
{
    int i, j;
    get_key();
    Code = a[0];
    decoder(key);
    C_code(Code);
    for (i = 0; i<8; i++)
        code[i] = XOR(code[i], v[i]);
    C_code_b(a[0]);
    a[0] = ReCode(code);
    for (j = 1; j<100; j++)
    {
        Code = a[j];
        decoder(key);
        C_code(Code);
        for (i = 0; i<8; i++)
            code[i] = XOR(code[i], b[i]);
        C_code_b(a[j]);
        a[j] = ReCode(code);
    }
}
时间: 2024-10-04 00:04:42

DES加密解密算法的相关文章

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

javascript DES加密解密算法

原文:javascript DES加密解密算法 源代码下载地址:http://www.zuidaima.com/share/1550463672044544.htm javascript DES加密解密算法,java通过ScriptEngineManager调用的例子. 源码截图:

用JAVA实现的DES加密解密算法

package Encrypt; import java.security.*; import javax.crypto.*; import sun.misc.*; /** * 使用DES加密与解密,可对byte[],String类型进行加密与解密 * 密文可使用String,byte[]存储. * 方法: * void getKey(String strKey)从strKey的字条生成一个Key * String getEncString(String strMing)对strMing进行加密

DES加密解密算法C语言代码实现

代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 /*------------------------ 5 定义枚举型全局变量 6 ------------------------*/ 7 typedef enum 8 { 9 false = 0, 10 true = 1 11 } bool; 12 13 // 十六轮子密钥 14 static bool SubKey[16][48]=

android -------- DES加密解密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来.需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来. DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法

DES加密解密-&gt;java实现

DES加密解密涉及到的JAVA类 Cipher 此类为加密和解密提供密码功能.它构成了 Java Cryptographic Extension (JCE) 框架的核心. 为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它.还可以指定提供者的名称(可选). 转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作).转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案. 转换具有以

java/php DES/CBC/PKCS5Padding加密解密算法实现过程

先看java代码 Java代码   public static String encrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory k

des加密解密——java加密,php解密

最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混杂,好不容易测试在php这边测试加密和解密成功了.为确保安卓app端提交过来的加密参数能够解密出来,给定安卓人员一个字符串,让他们把des加密后的字符串给我,在php这边解密.结果一看,加密出来的字符串跟我这边加密出来的结果不一致,自然是解密不出来. 要来java的des算法代码,研究加密的过程,其

兼容PHP和Java的des加密解密代码分享

这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 php <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加