逆元(数论倒数)【密码学笔记】

数论倒数,又称逆元

取模

对于取模,有一下一些性质:

但是唯独除法是不满足的:

为什么除法错的呢?很好证明:

而对于一些题目,我们必须在中间过程中进行求余,否则数字太大,电脑存不下,那如果这个算式中出现除法,我们就需要逆元了。

逆元

定义:

我们知道,如果a*x = 1,那么x是a的倒数,x = 1/a

而在数论问题中,大部分情况都有取模,所以问题就变成了:

这时x在数值上就不一定等于我们常规意义上的1/a了,我们可以理解为要求在0,1,2……p-1之间找一个数,是的这个数和a相乘后再取模p,得到的结果为1。

现在就要在回到刚才的问题了,除以一个数等于乘上这个数的倒数,在除法取余的情况下,就是乘上这个数的逆元,即:<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
密码学仿射变换是一种简单的加密算法,可以用来加密和解密文本。它基于线性变换,将每个字母用另一个字母替代。 以下是用C语言实现密码学仿射变换的示例代码: ```c #include<stdio.h> #include<stdlib.h> #include<string.h> // 仿射变换加密函数 void affine_encrypt(char* plaintext, int a, int b) { int len = strlen(plaintext); char ciphertext[len]; for(int i=0; i<len; i++) { // 将大写字母转换为数字 int x = plaintext[i] - 'A'; // 进行仿射变换 x = (a*x + b) % 26; // 将数字转换为大写字母 ciphertext[i] = x + 'A'; } // 打印加密后的密文 printf("Cipher text: %s\n", ciphertext); } // 仿射变换解密函数 void affine_decrypt(char* ciphertext, int a, int b) { int len = strlen(ciphertext); char plaintext[len]; // 计算a的逆元,用于解密 int a_inv = 0; for(int i=0; i<26; i++) { if((a*i) % 26 == 1) { a_inv = i; break; } } for(int i=0; i<len; i++) { // 将大写字母转换为数字 int x = ciphertext[i] - 'A'; // 进行仿射变换的逆操作 x = (a_inv * (x - b + 26)) % 26; // 将数字转换为大写字母 plaintext[i] = x + 'A'; } // 打印解密后的明文 printf("Plain text: %s\n", plaintext); } int main() { char plaintext[100]; int a, b; // 输入明文,a和b的值 printf("Enter plain text: "); scanf("%s", plaintext); printf("Enter value of a: "); scanf("%d", &a); printf("Enter value of b: "); scanf("%d", &b); // 加密明文 affine_encrypt(plaintext, a, b); // 解密密文 char ciphertext[100]; strcpy(ciphertext, "ZLKVWFY"); affine_decrypt(ciphertext, a, b); return 0; } ``` 在上面的示例代码,我们定义了两个函数affine_encrypt()和affine_decrypt(),分别用于加密和解密文本。其,a和b是仿射变换的参数,plaintext是明文,ciphertext是密文。 在主函数,我们首先输入明文和a、b的值,然后调用affine_encrypt()函数进行加密,最后调用affine_decrypt()函数进行解密。在这里,我们手动指定了一个密文,你可以根据需要修改。 注意,由于这是一个简单的加密算法,如果使用不当,仍然可能被攻击者破解。因此,在实际应用,我们需要使用更加复杂和安全的加密算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值