[关闭]
@2017libin 2019-09-28T02:33:09.000000Z 字数 1150 阅读 68

作业三

密码学

相关函数的定义

  1. # include<iostream>
  2. using namespace std;
  3. int x, y, d;
  4. int q=0, r=0;
  5. //定义G(2^8)中的 x*2
  6. int mul2(int x){
  7. if (x&0x80) return ((x << 1) ^ 27)&255; //&255表示 只取一个字节
  8. else return (x << 1)&255;
  9. }
  10. //G(2^8)乘法
  11. int mul(int x, int y) {
  12. int r = 0, tmp = x;
  13. while (y) {
  14. if (y % 2) r ^= tmp; //加法取模相当于亦或
  15. tmp = mul2(tmp);
  16. y /= 2;
  17. }
  18. return r;
  19. }
  20. //获取最高位1的位置
  21. int hight_index(int x) {
  22. if (!x) return 0; //x等于0,返回0。表示不存在最高位的1
  23. int index = 1;
  24. while (x >> 1) {
  25. x = x >> 1;
  26. ++index;
  27. }
  28. return index;
  29. }
  30. //G(2^n)除法
  31. void divi(int a, int b) {
  32. int tmp = 0;
  33. r = 0; q = 0;
  34. while (b <= a) {
  35. tmp = 1;
  36. int indexB = hight_index(b), indexA = hight_index(a);
  37. int dis = indexA - indexB;
  38. tmp = tmp << dis;
  39. q += tmp;
  40. a = a ^ (tmp*b);
  41. }
  42. r = a;
  43. }
  44. //ax + by = d = gcd(a,b), 其中a>b
  45. int egcd(int a, int b) {
  46. int x1 = 1, y1 = 0, x2 = 0, y2 = 1;
  47. int tmp_x, tmp_y;
  48. while(b){
  49. divi(a, b);
  50. tmp_x = x2;
  51. tmp_y = y2;
  52. x2 = x1^mul(x2,q); //1式 减去 (2式 * q), 接着轮换系数
  53. y2 = y1^mul(y2,q);
  54. x1 = tmp_x;
  55. y1 = tmp_y;
  56. a = b;
  57. b = r;
  58. }
  59. return y1;
  60. }

测试乘法

  通过穷举来判断是否所有的元素都有逆元,从而间接的判断这个算法是不是有问题的。经验证,确实所有的数都存在乘法逆元!
  

  1. int main() {
  2. for (int i = 1; i <= 255; ++i) {
  3. for (int j = 1; j <= 255; ++j) {
  4. if (mul(i, j) % 283 == 1) {
  5. cout << i << "的逆元是:" << j << endl;
  6. break;
  7. }
  8. }
  9. }
  10. system("pause");
  11. return 0;
  12. }

test_mul.png

测试

  这里用egcd来求出1到255的逆元,并与之前测试乘法所求的逆元相对比。发现两次求得逆元是相同的。或许这样子可以验证egcd算法结果的正确性???(我也不知道行不行)

  1. int main() {
  2. for (int i = 1; i <= 255; ++i)
  3. cout << i << "的逆元是:" << egcd(283, i) << endl;
  4. system("pause");
  5. return 0;
  6. }

test_egcd.png

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注