教学服务系统

 找回密码
 立即注册
搜索
查看: 785|回复: 2

信息计算2019级2班17号戴隆俊

[复制链接]

11

主题

22

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2022-6-3 12:49:30 | 显示全部楼层 |阅读模式

一、RSA加密

RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密;是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。

二、对签名和验签过程详细解释:

签名过程:

  • A计算消息m的消息摘要,记为 h(m)
  • A使用私钥(n,d)对h(m)加密,生成签名s, s满足:s=(h(m))^d mod n;
    由于A是用自己的私钥对消息摘要加密,所以只用使用s的公钥才能解密该消息摘要,这样A就不可否认自己发送了该消息给B.
  • A发送消息和签名(m,s)给B

验签过程:

  • B计算消息m的消息摘要(计算方式和A相同),记为h(m)
  • B使用A的公钥(n,e)解密s,得到 H(m), H(m) = s^e mod n
  • B比较H(m)与h(m),相同才能证明验签成功

三、对加密/解密和签名/验签完整过程详细解释:
A->B:
1.A提取消息m的消息摘要h(m),并使用自己的私钥对摘要h(m)进行加密,生成签名s
2.A将签名s和消息m一起,使用B的公钥进行加密,生成密文c,发送给B

B:
1.B接收到密文c,使用自己的私钥解密c得到明文m和数字签名s
2.B使用A的公钥解密数字签名s解密得到H(m)
3.B使用相同的方法提取消息m的消息摘要h(m)
4.B比较两个消息摘要。相同则验证成功;不同则验证失败

  1. import java.io.ByteArrayOutputStream;
  2. import java.security.KeyFactory;
  3. import java.security.KeyPair;
  4. import java.security.KeyPairGenerator;
  5. import java.security.PrivateKey;
  6. import java.security.PublicKey;
  7. import java.security.Signature;
  8. import java.security.spec.PKCS8EncodedKeySpec;
  9. import java.security.spec.X509EncodedKeySpec;
  10. import javax.crypto.Cipher;
  11. import org.apache.commons.codec.binary.Base64;

  12. public class TestRSA {

  13.     /**
  14.      * RSA最大加密明文大小
  15.      */
  16.     private static final int MAX_ENCRYPT_BLOCK = 64;

  17.     /**
  18.      * RSA最大解密密文大小
  19.      */
  20.     private static final int MAX_DECRYPT_BLOCK = 75;

  21.     /**
  22.      * 获取密钥对
  23.      *
  24.      * @return 密钥对
  25.      */
  26.     public static KeyPair getKeyPair() throws Exception {
  27.         KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
  28.         generator.initialize(512);
  29.         return generator.generateKeyPair();
  30.     }

  31.     /**
  32.      * 获取私钥
  33.      *
  34.      * @param privateKey 私钥字符串
  35.      * @return
  36.      */
  37.     public static PrivateKey getPrivateKey(String privateKey) throws Exception {
  38.         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  39.         byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes());
  40.         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
  41.         return keyFactory.generatePrivate(keySpec);
  42.     }

  43.     /**
  44.      * 获取公钥
  45.      *
  46.      * @param publicKey 公钥字符串
  47.      * @return
  48.      */
  49.     public static PublicKey getPublicKey(String publicKey) throws Exception {
  50.         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  51.         byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes());
  52.         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
  53.         return keyFactory.generatePublic(keySpec);
  54.     }

  55.     /**
  56.      * RSA加密
  57.      *
  58.      * @param data 待加密数据
  59.      * @param publicKey 公钥
  60.      * @return
  61.      */
  62.     public static String encrypt(String data, PublicKey publicKey) throws Exception {
  63.         Cipher cipher = Cipher.getInstance("RSA");
  64.         cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  65.         int inputLen = data.getBytes().length;
  66.         ByteArrayOutputStream out = new ByteArrayOutputStream();
  67.         int offset = 0;
  68.         byte[] cache;
  69.         int i = 0;
  70.         // 对数据分段加密
  71.         while (inputLen - offset > 0) {
  72.             if (inputLen - offset > MAX_ENCRYPT_BLOCK) {
  73.                 cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK);
  74.             } else {
  75.                 cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset);
  76.             }
  77.             out.write(cache, 0, cache.length);
  78.             i++;
  79.             offset = i * MAX_ENCRYPT_BLOCK;
  80.         }
  81.         byte[] encryptedData = out.toByteArray();
  82.         out.close();
  83.         // 获取加密内容使用base64进行编码,并以UTF-8为标准转化成字符串
  84.         // 加密后的字符串
  85.         return new String(Base64.encodeBase64String(encryptedData));
  86.     }

  87.     /**
  88.      * RSA解密
  89.      *
  90.      * @param data 待解密数据
  91.      * @param privateKey 私钥
  92.      * @return
  93.      */
  94.     public static String decrypt(String data, PrivateKey privateKey) throws Exception {
  95.         Cipher cipher = Cipher.getInstance("RSA");
  96.         cipher.init(Cipher.DECRYPT_MODE, privateKey);
  97.         byte[] dataBytes = Base64.decodeBase64(data);
  98.         int inputLen = dataBytes.length;
  99.         ByteArrayOutputStream out = new ByteArrayOutputStream();
  100.         int offset = 0;
  101.         byte[] cache;
  102.         int i = 0;
  103.         // 对数据分段解密
  104.         while (inputLen - offset > 0) {
  105.             if (inputLen - offset > MAX_DECRYPT_BLOCK) {
  106.                 cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
  107.             } else {
  108.                 cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
  109.             }
  110.             out.write(cache, 0, cache.length);
  111.             i++;
  112.             offset = i * MAX_DECRYPT_BLOCK;
  113.         }
  114.         byte[] decryptedData = out.toByteArray();
  115.         out.close();
  116.         // 解密后的内容
  117.         return new String(decryptedData, "UTF-8");
  118.     }

  119.     /**
  120.      * 签名
  121.      *
  122.      * @param data 待签名数据
  123.      * @param privateKey 私钥
  124.      * @return 签名
  125.      */
  126.     public static String sign(String data, PrivateKey privateKey) throws Exception {
  127.         byte[] keyBytes = privateKey.getEncoded();
  128.         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
  129.         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  130.         PrivateKey key = keyFactory.generatePrivate(keySpec);
  131.         Signature signature = Signature.getInstance("MD5withRSA");
  132.         signature.initSign(key);
  133.         signature.update(data.getBytes());
  134.         return new String(Base64.encodeBase64(signature.sign()));
  135.     }

  136.     /**
  137.      * 验签
  138.      *
  139.      * @param srcData 原始字符串
  140.      * @param publicKey 公钥
  141.      * @param sign 签名
  142.      * @return 是否验签通过
  143.      */
  144.     public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
  145.         byte[] keyBytes = publicKey.getEncoded();
  146.         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  147.         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  148.         PublicKey key = keyFactory.generatePublic(keySpec);
  149.         Signature signature = Signature.getInstance("MD5withRSA");
  150.         signature.initVerify(key);
  151.         signature.update(srcData.getBytes());
  152.         return signature.verify(Base64.decodeBase64(sign.getBytes()));
  153.     }
  154. }
  155. public static void main(String[] args) {
  156.         try {
  157.             // 生成密钥对
  158.             KeyPair keyPair = getKeyPair();
  159.             String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));
  160.             String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));
  161.             System.out.println("私钥:" + privateKey);
  162.             System.out.println("公钥:" + publicKey);
  163.             // RSA加密 待加密的文字内容
  164.             String data = "123456";
  165.             String encryptData = encrypt(data, getPublicKey(publicKey));
  166.             System.out.println("加密前内容:" + data);
  167.             System.out.println("加密后内容:" + encryptData);
  168.             // RSA解密
  169.             String decryptData = decrypt(encryptData, getPrivateKey(privateKey));
  170.             System.out.println("解密后内容:" + decryptData);

  171.             // RSA签名
  172.             String sign = sign(data, getPrivateKey(privateKey));
  173.             // RSA验签
  174.             boolean result = verify(data, getPublicKey(publicKey), sign);
  175.             System.out.print("验签结果:" + result);
  176.         } catch (Exception e) {
  177.             e.printStackTrace();
  178.             System.out.print("加解密异常");
  179.         }
  180. }


复制代码


回复

使用道具 举报

11

主题

22

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-6-3 12:56:25 | 显示全部楼层
ECC-椭圆曲线加密
一、算法简介
椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。
ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。

二、基本原理
设私钥、公钥分别为d、Q,即Q = dG,其中G为基点,椭圆曲线上的已知G和dG,求d是非常困难的,也就是说已知公钥和基点,想要算出私钥是非常困难的。
公钥加密:选择随机数r,将消息M生成密文C,该密文是一个点对,C = {rG, M+rQ},其中Q为公钥。
私钥解密:M + rQ - d(rG) = M + r(dG) - d(rG) = M,其中d、Q分别为私钥、公钥。

椭圆曲线签名算法(ECDSA)

设私钥、公钥分别为d、Q,即Q = dG,其中G为基点。
私钥签名
选择随机数r,计算点rG(x, y)。
根据随机数r、消息M的哈希h、私钥d,计算s = (h + dx)/r。  
将消息M、和签名{rG, s}发给接收方。

公钥验证签名:
接收方收到消息M、以及签名{rG=(x,y), s}。  
根据消息求哈希h。  
使用发送方公钥Q计算:hG/s + xQ/s,并与rG比较,如相等即验签成功。
原理:hG/s + xQ/s = hG/s + xG)/s = (h+xd)G/s = r(h+xd)G / (h+dx) = rG


源代码:
  1. # include <stdio.h>
  2. # include <math.h>
  3. using System.Drawing;

  4. int xy[22];

  5. #define N 23
  6. #define A 1
  7. #define M 29
  8. #define a1 1
  9. #define b1 4
  10. typedef struct point
  11. {
  12.         int x;
  13.         int y;
  14. }
  15. Point;
  16. typedef struct ecc
  17. {
  18.         struct point p[100];
  19.         int len;
  20. }
  21. ECCPoint;
  22. typedef struct generator
  23. {
  24.         Point p;
  25.         int p_class;
  26. }
  27. GENE_SET;
  28. ECCPoint eccPoint;
  29. Point mul(Point p1, Point p2);
  30. Point add_two_points(Point p1, Point p2);
  31. GENE_SET geneSet[100];
  32. int geneLen;
  33. //判断平方根是否为整数
  34. int int_sqrt(int s)
  35. {
  36.         int temp;
  37.         temp = (int)sqrt(s);//转为整型
  38.         if (temp * temp == s)
  39.         {
  40.                 return temp;
  41.         }
  42.         else
  43.         {
  44.                 return -1;
  45.         }
  46. }
  47. //取模函数
  48. int mod_p(int s)
  49. {
  50.         int i;  //保存s/p的倍数
  51.         int result; //模运算的结果
  52.         i = s / N;
  53.         result = s - i * N;
  54.         if (result >= 0)
  55.         {
  56.                 return result;
  57.         }
  58.         else
  59.         {
  60.                 return result + N;
  61.         }
  62. }
  63. //打印点集
  64. void print()
  65. {
  66.         int i;
  67.         int len = eccPoint.len;
  68.         printf("\n该椭圆曲线上共有%d个点(包含无穷远点)\n", len + 1);
  69.         for (i = 0; i < len; i++)
  70.         {
  71.                 if (i % 8 == 0)
  72.                 {
  73.                         printf("\n");
  74.                 }
  75.                 printf("(%2d,%2d)\t", eccPoint.p[i].x, eccPoint.p[i].y);
  76.         }
  77.         printf("\n");
  78. }
  79. //task1:求出椭圆曲线上所有点
  80. void get_all_points()
  81. {
  82.         int i = 0;
  83.         int j = 0;
  84.         int s, y = 0;
  85.         int n = 0, q = 0;
  86.         int modsqrt = 0;
  87.         int flag = 0;
  88.         if (a1 * a1 * a1 + b1 * b1 + 4 != 0)
  89.         {
  90.                 for (i = 0; i <= N - 1; i++)
  91.                 {
  92.                         flag = 0;
  93.                         n = 1;
  94.                         y = 0;
  95.                         s = i * i * i + a1 * i + b1;
  96.                         while (s < 0)
  97.                         {
  98.                                 s += N;
  99.                         }
  100.                         s = mod_p(s);
  101.                         modsqrt = int_sqrt(s);
  102.                         if (modsqrt != -1)
  103.                         {
  104.                                 flag = 1;
  105.                                 y = modsqrt;
  106.                         }
  107.                         else
  108.                         {
  109.                                 while (n <= N - 1)
  110.                                 {
  111.                                         q = s + n * N;
  112.                                         modsqrt = int_sqrt(q);
  113.                                         if (modsqrt != -1)
  114.                                         {
  115.                                                 y = modsqrt;
  116.                                                 flag = 1;
  117.                                                 break;
  118.                                         }
  119.                                         flag = 0;
  120.                                         n++;
  121.                                 }
  122.                         }
  123.                         if (flag == 1)
  124.                         {
  125.                                 eccPoint.p[j].x = i;
  126.                                 eccPoint.p[j].y = y;
  127.                                 j++;
  128.                                 if (y != 0)
  129.                                 {
  130.                                         eccPoint.p[j].x = i;
  131.                                         eccPoint.p[j].y = (N - y) % N;
  132.                                         j++;
  133.                                 }
  134.                         }
  135.                 }
  136.                 eccPoint.len = j;//点集个数
  137.                 print(); //打印点集
  138.         }
  139. }

  140. //task3:求生成元以及阶
  141. void get_generetor_class()
  142. {
  143.         int i, j = 0;
  144.         int count = 1;
  145.         Point p1, p2;
  146.         get_all_points();
  147.         printf("\n**********************************输出生成元以及阶:*************************************\n");
  148.         for (i = 0; i < eccPoint.len; i++)
  149.         {
  150.                 count = 1;
  151.                 p1.x = p2.x = eccPoint.p[i].x;
  152.                 p1.y = p2.y = eccPoint.p[i].y;
  153.                 while (1)
  154.                 {
  155.                         p2 = add_two_points(p1, p2);
  156.                         if (p2.x == -1 && p2.y == -1)
  157.                         {
  158.                                 break;
  159.                         }
  160.                         count++;
  161.                         if (p2.x == p1.x)
  162.                         {
  163.                                 break;
  164.                         }
  165.                 }
  166.                 count++;
  167.                 if (count <= eccPoint.len + 1)
  168.                 {
  169.                         geneSet[j].p.x = p1.x;
  170.                         geneSet[j].p.y = p1.y;
  171.                         geneSet[j].p_class = count;
  172.                         printf("(%d,%d)--->>%d\t", geneSet[j].p.x, geneSet[j].p.y, geneSet[j].p_class);
  173.                         j++;
  174.                         if (j % 6 == 0)
  175.                         {
  176.                                 printf("\n");
  177.                         }
  178.                 }
  179.                 geneLen = j;
  180.         }
  181. }
复制代码

回复

使用道具 举报

11

主题

22

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-6-3 12:56:45 | 显示全部楼层
戴隆俊 发表于 2022-6-3 12:56
ECC-椭圆曲线加密
一、算法简介
椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985 ...
  1. // 求 a mod b 的逆元
  2. void exGcd(int a, int b)
  3. {
  4.         if (b == 0)
  5.         {
  6.                 xy[0] = 1;
  7.                 xy[1] = 0;
  8.         }
  9.         else
  10.         {
  11.                 exGcd(b, a % b);
  12.                 int x = xy[0];
  13.                 xy[0] = xy[1];
  14.                 xy[1] = x - (a / b) * xy[1];
  15.         }

  16. }
  17. int calculate3(int y, int k, int p)
  18. {

  19.         int l = 1;
  20.         for (int i = 0; i < k; i++)
  21.         {
  22.                 l = l * y;
  23.                 l = l % p;
  24.         }

  25.         return l;
  26. }

  27. Point eccmutiply(int n, Point p)
  28. {
  29.         int a, b, l, k, m;
  30.         a = p.x;
  31.         b = p.y;
  32.         for (int i = 0; i < n - 1; i++)
  33.         {

  34.                 if (a == p.x && b == p.y)
  35.                 {
  36.                         exGcd(2 * p.y, N);
  37.                         k = xy[0];
  38.                         if (k < 0) k = k + N;
  39.                         printf("逆元=%d\n", k);
  40.                         l = (3 * p.x * p.x + A) * k;
  41.                         l = calculate3(l, 1, N);
  42.                         if (l < 0)
  43.                         {
  44.                                 l = l + N;
  45.                         }
  46.                 }
  47.                 else
  48.                 {
  49.                         exGcd(a - p.x + N, N);
  50.                         k = xy[0];
  51.                         if (k < 0) k = k + N;
  52.                         printf("else逆元=%d\n", k);
  53.                         l = (b - p.y) * k;
  54.                         l = calculate3(l, 1, N);
  55.                         if (l < 0)
  56.                         {
  57.                                 l = l + N;
  58.                         }
  59.                         printf("l=%d\n", l);
  60.                 }
  61.                 m = p.x;
  62.                 a = l * l - a - p.x;
  63.                 a = calculate3(a, 1, N);
  64.                 if (a < 0)
  65.                 {
  66.                         a = a + N;
  67.                 }
  68.                 b = l * (m - a) - p.y;
  69.                 b = calculate3(b, 1, N);

  70.                 if (b < 0)
  71.                 {
  72.                         b = b + N;
  73.                 }
  74.                 printf("%d(a,b)=(%d,%d)\n", i + 2, a, b);
  75.                 //if(a==4&&b==5)break;
  76.         }
  77.         Point p3;
  78.         p3.x = a;
  79.         p3.y = b;
  80.         return p3;
  81. }
  82. Point mul(Point p1, Point p2)
  83. {
  84.         int k, l;
  85.         exGcd(p2.x - p1.x + N, N);
  86.         k = xy[0];
  87.         if (k < 0) k = k + N;
  88.         //printf("else逆元=%d\n",k);
  89.         l = (p2.y - p1.y) * k;
  90.         l = calculate3(l, 1, N);
  91.         if (l < 0)
  92.         {
  93.                 l = l + N;
  94.         }
  95.         //printf("l=%d\n",l);      
  96.         Point p3;
  97.         p3.x = l * l - p1.x - p2.x;
  98.         p3.x = calculate3(p3.x, 1, N);
  99.         if (p3.x < 0) p3.x = p3.x + N;

  100.         p3.y = l * (p1.x - p3.x) - p1.y;
  101.         p3.y = calculate3(p3.y, 1, N);
  102.         if (p3.y < 0) p3.y = p3.y + N;
  103.         return p3;
  104. }

  105. //求b关于n的逆元
  106. int inverse(int n, int b)
  107. {
  108.         int q, r, r1 = n, r2 = b, t, t1 = 0, t2 = 1, i = 1;
  109.         while (r2 > 0)
  110.         {
  111.                 q = r1 / r2;
  112.                 r = r1 % r2;
  113.                 r1 = r2;
  114.                 r2 = r;
  115.                 t = t1 - q * t2;
  116.                 t1 = t2;
  117.                 t2 = t;
  118.         }
  119.         if (t1 >= 0)
  120.                 return t1 % n;
  121.         else
  122.         {
  123.                 while ((t1 + i * n) < 0)
  124.                         i++;
  125.                 return t1 + i * n;
  126.         }
  127. }
  128. //两点的加法运算
  129. Point add_two_points(Point p1, Point p2)
  130. {
  131.         long t;
  132.         int x1 = p1.x;
  133.         int y1 = p1.y;
  134.         int x2 = p2.x;
  135.         int y2 = p2.y;
  136.         int tx, ty;
  137.         int x3, y3;
  138.         int flag = 0;
  139.         //求
  140.         if ((x2 == x1) && (y2 == y1))
  141.         {
  142.                 //相同点相加
  143.                 if (y1 == 0)
  144.                 {
  145.                         flag = 1;
  146.                 }
  147.                 else
  148.                 {
  149.                         t = (3 * x1 * x1 + a1) * inverse(N, 2 * y1) % N;
  150.                 }
  151.                 //printf("inverse(p,2*y1)=%d\n",inverse(p,2*y1));
  152.         }
  153.         else
  154.         {
  155.                 //不同点相加
  156.                 ty = y2 - y1;
  157.                 tx = x2 - x1;
  158.                 while (ty < 0)
  159.                 {
  160.                         ty += N;
  161.                 }
  162.                 while (tx < 0)
  163.                 {
  164.                         tx += N;
  165.                 }
  166.                 if (tx == 0 && ty != 0)
  167.                 {
  168.                         flag = 1;
  169.                 }
  170.                 else
  171.                 {
  172.                         t = ty * inverse(N, tx) % N;
  173.                 }
  174.         }
  175.         if (flag == 1)
  176.         {
  177.                 p2.x = -1;
  178.                 p2.y = -1;
  179.         }
  180.         else
  181.         {
  182.                 x3 = (t * t - x1 - x2) % N;
  183.                 y3 = (t * (x1 - x3) - y1) % N;
  184.                 //使结果在有限域GF(P)上
  185.                 while (x3 < 0)
  186.                 {
  187.                         x3 += N;
  188.                 }
  189.                 while (y3 < 0)
  190.                 {
  191.                         y3 += N;
  192.                 }
  193.                 p2.x = x3;
  194.                 p2.y = y3;
  195.         }
  196.         return p2;
  197. }
  198. //task2:倍点运算的递归算法
  199. Point timesPiont(int k, Point p0)
  200. {
  201.         if (k == 1)
  202.         {
  203.                 return p0;
  204.         }
  205.         else if (k == 2)
  206.         {
  207.                 return add_two_points(p0, p0);
  208.         }
  209.         else
  210.         {
  211.                 return add_two_points(p0, timesPiont(k - 1, p0));
  212.         }
  213. }
  214. main(){
  215.         get_generetor_class();
  216.         Point p1, p2, p, p4, p5, p6, p7, p8, p9, p10;
  217.         int na, k, h, r, s, u1, u2;
  218.         printf("选择生成元");
  219.         scanf("%d%d", &p1.x, &p1.y);
  220.         int j = 0;
  221.         while (j < N)
  222.         {

  223.                 if (geneSet[j].p.x == p1.x && geneSet[j].p.y == p1.y)
  224.                 {
  225.                         break;
  226.                 }
  227.                 printf("j=%d\n", j);
  228.                 ++j;
  229.         }
  230.         int M = geneSet[j].p_class;
  231.         printf("M=%d", M);
  232.         //        p1.x=0;
  233.         //        p1.y=2;
  234.         //p.x=20;
  235.         //p.y=1;
  236.         printf("请输入私钥");
  237.         scanf("%d", &na);
  238.         p2 = eccmutiply(na, p1);
  239.         printf("公钥为(%d,%d)", p2.x, p2.y);
  240.         //p2=mul(p,p1);

  241.         //printf("(%d,%d)",p2.x,p2.y);

  242.         //签名过程
  243.         printf("输入随机数k\n");
  244.         scanf("%d", &k);
  245.         printf("输入hash\n");
  246.         scanf("%d", &h);


  247.         p4 = eccmutiply(k, p1);
  248.         r = calculate3(p4.x, 1, N);
  249.         if (r < 0) r = r + N;
  250.         s = inverse(M, k) * (h + na * r) % M;
  251.         if (s < 0) s = s + N;
  252.         printf("签名为(%d,%d)\n", r, s);
  253.         printf("========================");
  254.         //验证过程
  255.         u1 = h * inverse(M, s) % M;

  256.         if (u1 < 0) u1 = u1 + M;
  257.         u2 = r * inverse(M, s) % M;

  258.         if (u2 < 0) u2 = u2 + M;

  259.         printf("u1u2=%d,%d\n", u1, u2);

  260.         p5 = eccmutiply(u1, p1);
  261.         printf("sG=(%d,%d)\n", p5.x, p5.y);

  262.         p6 = eccmutiply(u2, p2);
  263.         printf("HP=(%d,%d)\n", p6.x, p6.y);

  264.         p7 = add_two_points(p5, p6);
  265.         printf("sG+HP=(%d,%d)\n", p7.x, p7.y);
  266.         if (calculate3(p7.x, 1, N) == r)
  267.         {
  268.                 printf("通过");
  269.         }
  270.         else
  271.         {
  272.                 printf("失败");
  273.         }

  274. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-4-30 01:25 , Processed in 0.023685 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表