置换密码代码简单实现(C语言)

置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。

 

代码实现:

#include<stdio.h>
#include<string.h>

int main()
{
    char m[999999],c[999999];
    int x[26];
    int t,k,len,a=0;
    printf("请输入你要输入的明文:");
    scanf("%s",m);
    len=strlen(m);
    printf("\n");

    printf("选择密钥长度:");
    scanf("%d",&k);
    t=k-len%k; //补全空格位数
    printf("\n");


    printf("请输入你选择的密钥方式:\n");
    for(int i=0; i<k; i++)
        scanf("%d",&x[i]);


    for(int j=0; j<(len+t)/k; j++) /* 分组 --> 这里j<3 有0,1,2三组 */
        for(int i=0; i<k; i++)
        {
            c[a++]=m[x[i]+k*j-1];
            /*
            m是输入的明文字符串
            x[i]是输入的密钥方式
            m[x[i]]即把密钥方式作为m字符串的数组位置
            */
            //printf("%d\n",x[i]+k*j);
        }

    for(int i=0; i<=len+t; i++)
        printf("%c",c[i]);
    printf("\n");

    return 0;
}

 

效果图:

  • 17
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
DES(Data Encryption Standard)是一种对称加密算法,实现数据的加密和解密。其密钥长度为56位,加密分为16轮。DES算法中有一个重要的步骤是扩展置换(Expansion Permutation),用于将输入的32位数据扩展为48位数据,以供后续的XOR运算。 下面是一个使用C语言实现DES算法中扩展置换的示例代码: ```C #include <stdio.h> // 扩展置换 int expansion_table[48] = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 }; // 执行扩展置换 void expand_permutation(int *input, int *output) { for (int i = 0; i < 48; i++) { output[i] = input[expansion_table[i] - 1]; } } int main() { int input[32] = { 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0 }; int output[48]; expand_permutation(input, output); printf("扩展置换结果:"); for (int i = 0; i < 48; i++) { printf("%d ", output[i]); } return 0; } ``` 在这个代码示例中,我们定义了一个扩展置换`expansion_table`,用于确定输入数据的扩展顺序。之后,我们定义了一个`expand_permutation`函数,用于执行扩展置换操作。最后,在`main`函数中,我们定义了一个输入数据`input`,并调用`expand_permutation`函数进行扩展置换,得到输出结果`output`。 通过运行以上代码,你将会得到扩展置换的结果。这个结果将会是一个48位的数据。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟敛寒林o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值