教学服务系统

 找回密码
 立即注册
搜索
查看: 567|回复: 1

信息计算2019级2班4号袁敏婷

[复制链接]

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2022-5-31 17:04:52 | 显示全部楼层 |阅读模式
本帖最后由 袁敏婷 于 2022-5-31 17:06 编辑

RSA数字签名

一、原理:

当A想要给B发送数据,并想进行数字签名的时候,A只需要利用自己的私钥,对数据进行数字签名算法,就可以得到一个新的签名数据,这时A需要把自己原来的数据,以及新得到的签名数据都发送给B,B接受到签名数据之后,用A的公钥对签名数据进行验证算法,看得出来的数据与A发送过来的数据是不是完全一样的即可。

二、签名过程:

1.A计算消息m的消息摘要,记为 r(m);
2.A使用私钥(n,d)对r(m)加密,生成签名s ,s满足:s=(h(m))^d mod n;
3.A发送消息和签名(m,s)给B。

三、验签过程:

1.B计算消息m的消息摘要,记为r(m);
2.B使用A的公钥(n,e)解密s,得到:R(m)=s^e mod n;
3.B比较R(m)与r(m),相同则验证为正确。

四、签名过程:
1.A提取消息m的消息摘要r(m),并使用自己的私钥对摘要r(m)进行加密,生成签名s;
2.A将签名s和消息m一起,使用B的公钥进行加密,生成密文c,发送给B。

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

六、源代码:
  1. package rsaqm;
  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.interfaces.RSAPrivateKey;
  9. import java.security.interfaces.RSAPublicKey;
  10. import java.security.spec.PKCS8EncodedKeySpec;
  11. import java.security.spec.X509EncodedKeySpec;

  12. public class qianming {

  13.         private static String src = "CYK";

  14.         public static void main(String[] args) {
  15.                 jdkRSA();
  16.         }

  17.         public static void jdkRSA() {
  18.                 try {
  19.                         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");// 初始化秘钥
  20.                         keyPairGenerator.initialize(512);
  21.                         KeyPair keyPair = keyPairGenerator.generateKeyPair();
  22.                         RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();// 用作验证 公钥
  23.                         RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();// 用作签名 私钥
  24.                         PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());// 执行签名
  25.                         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  26.                         PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  27.                         Signature signature = Signature.getInstance("MD5withRSA");// 签名对象
  28.                         signature.initSign(privateKey);// 签名对象的初始化方法
  29.                         signature.update(src.getBytes());
  30.                         byte[] result = signature.sign();
  31.                         System.out.println("RSA签名是:" + result);
  32.                         X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());// 验证签名
  33.                         keyFactory = KeyFactory.getInstance("RSA");
  34.                         PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  35.                         signature = Signature.getInstance("MD5withRSA");
  36.                         signature.initVerify(publicKey);
  37.                         signature.update(src.getBytes());
  38.                         boolean bool = signature.verify(result);
  39.                         System.out.println("签名验证结果为:" + bool);
  40.                 } catch (Exception e) {
  41.                         e.printStackTrace();
  42.                 }
  43.         }

  44. }
复制代码

七、运行结果:







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2022-5-31 18:28:15 | 显示全部楼层
ECC椭圆曲线上公钥密码

一、原理

1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G;
2、用户A选择一个私有密钥k,并生成公开密钥K=kG;
3、用户A将Ep(a,b)和点K,G传给用户B;
4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M,并产生一个随机整数r;
5、用户B计算点C1=M+rK,C2=rG;
6、用户B将C1、C2传给用户A;
7、用户A接到信息后,计算C1-kC2,结果就是点M。


二、执行过程

1、生成公钥和私钥;
2、公钥加密;
3、私钥解密;
4、用私钥对信息生成数字签名;

三、源代码


  1. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  2. import javax.crypto.Cipher;
  3. import java.security.*;
  4. import java.security.interfaces.ECPrivateKey;
  5. import java.security.spec.PKCS8EncodedKeySpec;
  6. import java.security.spec.X509EncodedKeySpec;
  7. import java.util.Base64;

  8. public class ECC {
  9.         // 生成公钥和私钥
  10.         public static KeyPair initKey(int keySize, String KEY_ALGORITHM) throws Exception {
  11.                 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
  12.                 keyPairGen.initialize(keySize);
  13.                 KeyPair keyPair = keyPairGen.generateKeyPair();
  14.                 return keyPair;
  15.         }

  16.         // 公钥加密
  17.         public static String encryptByPublicKey(String data, String publicKey) throws Exception {
  18.                 byte[] keyBytes = Base64.getDecoder().decode(publicKey);
  19.                 Security.addProvider(new BouncyCastleProvider());
  20.                 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  21.                 KeyFactory keyFactory = KeyFactory.getInstance("EC");
  22.                 Cipher cipher = Cipher.getInstance("ECIES", "BC");
  23.                 cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(x509KeySpec));
  24.                 return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));

  25.         }

  26.         // 私钥解密
  27.         public static String decryptByPrivateKey(String encryptedData, String privateKey) throws Exception {
  28.                 byte[] keyBytes = Base64.getDecoder().decode(privateKey);
  29.                 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  30.                 KeyFactory keyFactory = KeyFactory.getInstance("EC");
  31.                 Security.addProvider(new BouncyCastleProvider());
  32.                 Cipher cipher = Cipher.getInstance("ECIES", "BC");
  33.                 cipher.init(Cipher.DECRYPT_MODE, keyFactory.generatePrivate(pkcs8KeySpec));
  34.                 return Base64.getEncoder().encodeToString(cipher.doFinal(Base64.getDecoder().decode(encryptedData)));
  35.         }

  36.         // 用私钥对信息生成数字签名
  37.         public static String sign(String content, String priKey, String signatureAl) throws Exception {
  38.                 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(priKey));
  39.                 KeyFactory keyFactory = KeyFactory.getInstance("EC");
  40.                 ECPrivateKey privateK = (ECPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
  41.                 Signature sign = Signature.getInstance(signatureAl);
  42.                 sign.initSign(privateK);
  43.                 sign.update(Base64.getDecoder().decode(content));
  44.                 return Base64.getEncoder().encodeToString(sign.sign());
  45.         }

  46.         public static void main(String[] args) {
  47.                 try {
  48.                         // 初始化获取公钥和私钥
  49.                         KeyPair keypair = initKey(256, "EC");
  50.                         PublicKey publicKey = keypair.getPublic();
  51.                         PrivateKey privateKey = keypair.getPrivate();
  52.                         System.out.println("私钥:" + privateKey);
  53.                         System.out.println("公钥:" + publicKey);

  54.                         // 生成固定公钥私钥
  55.                         String publicKeyBase64 = "xinxijisuan";
  56.                         String privateKeyBase64 = "yuanminting";
  57.                         System.out.println("公钥:" + publicKeyBase64);
  58.                         System.out.println("私钥:" + privateKeyBase64);
  59.                         String c = "信息计算";
  60.                         System.out.println("加密之前:" + c);
  61.                         String content = encryptByPublicKey(c, publicKeyBase64);
  62.                         String contentDe = decryptByPrivateKey(content, privateKeyBase64);
  63.                         String d = new String(Base64.getDecoder().decode(contentDe));
  64.                         System.out.println("解密之后:" + d);
  65.                 } catch (Exception e) {
  66.                         e.printStackTrace();
  67.                 }
  68.         }
  69. }
复制代码

四、运行结果:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则

教学服务系统

GMT+8, 2025-4-30 07:48 , Processed in 0.017852 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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