仿射密码算法实现(C语⾔以及Python实现)
加密:
解密:
其中a, b为密钥, ,且gcd(a, 26)=1
1.参数选取与密钥⽣成
⾸先让⽤户⾃⾏输⼊a,b的值。
判断a与N是否互素。(欧⼏⾥得算法)
利⽤a与N求得a的模逆aa。(扩展欧⼏⾥得算法)
由以上的<a,b>为加密秘钥对,<aa,b>为解密秘钥对。
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. 加密
加密运算即为:
此处加密时应该对输⼊的字符进⾏判断,具体判断⽅法如下:
while (ch != EOF)//ch为读取⽂件内容的指针
{
if (ch >= 65 && ch <= 90)//判断字符是否介于<A,Z>
{
re = (char)(((a*(ch - 65) + b) % N) + 65);
fputc(re, res);
}
if (ch >= 97 && ch <= 122)//判断字符是否介于<a,z>
{
re = (char)(((a*(ch - 97) + b) % N) + 65);
fputc(re, res);
}
else
putc(ch, res);//若不是字母则不加处理
ch = getc(fp);
}
3. 解密
解密运算即为:
while (re != EOF)
{
if (re >= 65 && re <= 90)
{
d = (char)(((aa*((r
e - 65) - b)+N) % N) + 65);
fputc(d, de);
}
if (re >= 97 && re <= 122)
{
d = (char)(((aa*((r
e - 97) - b)+N) % N) + 65);
fputc(d, de);
}
else编程先学c语言还是python
putc(re, de);
re = getc(res);
}
实验参考代码:
C语⾔:
再过⼀段时间上传,关键代码都在上边了。
python代码:
from Crypto.Util.number import inverse
with open("", '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)
加密及解密实例结果截图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论