仿射密码c语言实现加注释,仿射密码算法实现(C语言以及Python实现)

仿射变换:

加密:

ef21dc14c7bc3f7c73d2c2988c9f4232.png

解密:

f7786722a92d0cbeaebd2752e39f41e5.png

其中a, b为密钥,

c205def860e5353118ddd05c12312e27.png ,且gcd(a, 26)=1

1.参数选取与密钥生成

首先让用户自行输入a,b的值。

判断a与N是否互素。(欧几里得算法)

利用a与N求得a的模逆aa。(扩展欧几里得算法)

printf("please input a and b(divide with \",\"):");

scanf("%d,%d", &a, &b);

int gcd(int a, int b) {

return b ? gcd(b, a%b) : a;//求两数的最大公约数

}

//求a模N=26的逆

int exgcd(int a, int n) {

int p = a, q = n;

int x = 0, y = 1;

int z = q / p;

while (p != 1 && q != 1) {

int t = p;

p = q % p;

q = t;

t = y;

y = x - y * z;

x = t;

z = q / p;

}

y %= n;

if (y < 0) y += n;

return y;

}

2.加密

加密运算即为:

ef21dc14c7bc3f7c73d2c2988c9f4232.png

此处加密时应该对输入的字符进行判断,具体判断方法如下:

3.解密

解密运算即为:

f7786722a92d0cbeaebd2752e39f41e5.png

while (re != EOF)

{

if (re >= 65 && re <= 90)

{

d = (char)(((aa*((re - 65) - b)+N) % N) + 65);

fputc(d, de);

}

if (re >= 97 && re <= 122)

{

d = (char)(((aa*((re - 97) - b)+N) % N) + 65);

fputc(d, de);

}

else

putc(re, de);

re = getc(res);

}

实验参考代码:

C语言:

再过一段时间上传,关键代码都在上边了。

python代码:

from Crypto.Util.number import inverse

with open("cleartext.txt", 'r') as fp:

clear = fp.read()

clear = clear[:-1:]

print(clear)

a = int(input("Input a:"))

b = int(input("Input b:"))

cipher = ''.join([chr((a*(ord(each) - ord('a')) + b)%26+ord('a')) for each in clear])

a_inv = inverse(a,26)

decode = ''.join([chr((a_inv*(ord(each) - ord('a') - b))% 26 + ord('a')) for each in cipher])

print(cipher)

print(decode)

加密及解密实例结果截图:

ee498d6c1057752c3e4053a37d0c0129.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值