教学服务系统

 找回密码
 立即注册
搜索
查看: 658|回复: 6

信息计算2019级1班30号邓子龙

[复制链接]

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2022-4-19 11:54:35 | 显示全部楼层 |阅读模式

本帖子中包含更多资源

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

x
回复

使用道具 举报

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-4-22 15:39:48 | 显示全部楼层
4月22日截图

本帖子中包含更多资源

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

x
回复

使用道具 举报

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-5-3 19:39:04 | 显示全部楼层
5月3日截图

本帖子中包含更多资源

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

x
回复

使用道具 举报

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-6-2 00:29:35 | 显示全部楼层
RSA加密、解密、签名、验签的原理及方法
一、RSA加密简介
  RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。
二、RSA加密、签名区别

  加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。这里举2个例子说明。

第一个场景:战场上,B要给A传递一条消息,内容为某一指令。

RSA的加密过程如下:

(1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。

(2)A传递自己的公钥给B,B用A的公钥对消息进行加密。

(3)A接收到B加密的消息,利用A自己的私钥对消息进行解密。

  在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。



第二个场景:A收到B发的消息后,需要进行回复“收到”。

RSA签名的过程如下:

(1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。

(2)A用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。

(3)B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。

  在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。

  但是,综合两个场景你会发现,第一个场景虽然被截获的消息没有泄露,但是可以利用截获的公钥,将假指令进行加密,然后传递给A。第二个场景虽然截获的消息不能被篡改,但是消息的内容可以利用公钥验签来获得,并不能防止泄露。所以在实际应用中,要根据情况使用,也可以同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。

  总结:公钥加密、私钥解密、私钥签名、公钥验签。
回复

使用道具 举报

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-6-2 00:56:51 | 显示全部楼层
  1. import org.apache.commons.codec.binary.Base64;

  2. import javax.crypto.Cipher;
  3. import java.io.ByteArrayOutputStream;
  4. import java.security.*;
  5. import java.security.spec.PKCS8EncodedKeySpec;
  6. import java.security.spec.X509EncodedKeySpec;

  7. public class RSAUtil {
  8.     /**
  9.      * RSA最大加密明文大小
  10.      */
  11.     private static final int MAX_ENCRYPT_BLOCK = 117;

  12.     /**
  13.      * RSA最大解密密文大小
  14.      */
  15.     private static final int MAX_DECRYPT_BLOCK = 128;

  16.     private static final String KEY_ALGORITHM = "RSA";

  17.     /**
  18.      * 编码方式
  19.      */
  20.     private static final String CHARSET = "UTF-8";

  21.     private static final String SIGN_ALGORITHM = "MD5withRSA";

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


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

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

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

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

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

  137.     /**
  138.      * 验签
  139.      *
  140.      * @param srcData 原始字符串
  141.      * @param publicKey 公钥
  142.      * @param sign 签名
  143.      * @return 是否验签通过
  144.      */
  145.     public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
  146.         byte[] keyBytes = publicKey.getEncoded();
  147.         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  148.         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  149.         PublicKey key = keyFactory.generatePublic(keySpec);
  150.         Signature signature = Signature.getInstance(SIGN_ALGORITHM);
  151.         signature.initVerify(key);
  152.         signature.update(srcData.getBytes());
  153.         return signature.verify(Base64.decodeBase64(sign.getBytes()));
  154.     }


  155.     /**
  156.      * 测试
  157.      * @param args
  158.      */
  159.     public static void main(String[] args) throws Exception{
  160.         KeyPair keyPair = getKeyPair();
  161.         String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded()));
  162.         String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded()));

  163.         System.out.println("私钥:" + privateKey);
  164.         System.out.println("公钥:" + publicKey);

  165.         //RSA加密
  166.         String data = "需要加密的一段文字";
  167.         //公钥加密
  168.         String encryptData = RSAUtil.encrypt(data, getPublicKey(publicKey));
  169.         System.out.println("加密后的文字:" + encryptData);

  170.         //RSA解密
  171.         //私钥解密
  172.         String decryptData = RSAUtil.decrypt(encryptData, getPrivateKey(privateKey));
  173.         System.out.println("解密后的文字:"+decryptData);


  174.         //RSA签名
  175.         //使用私钥,对 加密的数据进行签名
  176.         String sign = RSAUtil.sign(encryptData, getPrivateKey(privateKey));

  177.         //RSA验签
  178.         boolean result = RSAUtil.verify(encryptData, getPublicKey(publicKey), sign);
  179.         System.out.println("验签结果:" + result);
  180.     }
  181. }
复制代码
回复

使用道具 举报

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-6-2 01:00:22 | 显示全部楼层
椭圆加密算法
椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。

ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。ECC的另一个优势是可以定义群之间的双线性映射,基于Weil对或是Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。

对于ECC系统来说,完成运行系统所必须的群操作比同样大小的因数分解系统或模整数离散对数系统要慢。不过,ECC系统的拥护者相信ECDLP问题比DLP或因数分解问题要难的多,并且因此使用ECC能用小的多的密钥长度来提供同等的安全,在这方面来说它确实比例如RSA之类的更快。已经公布的结果趋于支持这个结论,不过一些专家表示怀疑。
ECC被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。


回复

使用道具 举报

7

主题

20

帖子

107

积分

注册会员

Rank: 2

积分
107
 楼主| 发表于 2022-6-2 01:02:19 | 显示全部楼层
  1.                 <dependency>
  2.             <groupId>org.bouncycastle</groupId>
  3.             <artifactId>bcprov-jdk15on</artifactId>
  4.             <version>1.62</version>
  5.         </dependency>

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

  18.     /**
  19.      * 公钥加密
  20.      * @param data      源数据
  21.      * @param publicKey 公钥(BASE64编码)
  22.      * @return
  23.      * @throws Exception
  24.      */
  25.     public static String encryptByPublicKey(String data, String publicKey)
  26.             throws Exception {
  27.         Security.addProvider(new BouncyCastleProvider());
  28.         X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  29.         KeyFactory keyFactory = KeyFactory.getInstance("EC");      
  30.         Cipher cipher = Cipher.getInstance("ECIES","BC");
  31.         cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(x509KeySpec));
  32.         return Base64.getEncoder().encodeToString(cipher.doFinal(Base64.getDecoder().decode(data)));
  33.       
  34.     }
  35.     /**
  36.      * 私钥解密
  37.      *
  38.      * @param encryptedData 已加密数据
  39.      * @param privateKey    私钥(BASE64编码)
  40.      * @return
  41.      * @throws Exception
  42.      */
  43.     public static String decryptByPrivateKey(String encryptedData, String privateKey)
  44.             throws Exception {
  45.         byte[] keyBytes = Base64.getDecoder().decode(privateKey);
  46.         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  47.         KeyFactory keyFactory = KeyFactory.getInstance("EC");
  48.         Security.addProvider(new BouncyCastleProvider());
  49.         Cipher cipher = Cipher.getInstance("ECIES","BC");
  50.         cipher.init(Cipher.DECRYPT_MODE, keyFactory.generatePrivate(pkcs8KeySpec));
  51.         return Base64.getEncoder().encodeToString(cipher.doFinal(Base64.getDecoder().decode(encryptedData)));
  52.     }

  53.          /**
  54.      * 用私钥对信息生成数字签名
  55.      *
  56.      * @param content       已加密数据 base64
  57.      * @param priKey 私钥(BASE64编码)
  58.      * @param signatureAl 签名算法
  59.      * @return
  60.      * @throws Exception
  61.      */
  62.     public static String sign(String content, String priKey,String signatureAl) throws Exception {
  63.         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(priKey));
  64.         KeyFactory keyFactory = KeyFactory.getInstance("EC");
  65.         ECPrivateKey privateK = (ECPrivateKey)keyFactory.generatePrivate(pkcs8KeySpec);
  66.         Signature sign = Signature.getInstance(signatureAl);//"SHA256withECDSA"
  67.         sign.initSign(privateK);
  68.         sign.update(Base64.getDecoder().decode(content));
  69.         return Base64.getEncoder().encodeToString(sign.sign());
  70.     }

  71. /**
  72.      * 用私钥对信息生成数字签名
  73.      *
  74.      * @param content       已加密数据 base64
  75.      * @param priKey 私钥(BASE64编码)
  76.      * @param signatureAl 签名算法
  77.      * @return
  78.      * @throws Exception
  79.      */
  80.     public static String sign(String content, String priKey,String signatureAl) throws Exception {
  81.         PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(priKey));
  82.         KeyFactory keyFactory = KeyFactory.getInstance("EC");
  83.         ECPrivateKey privateK = (ECPrivateKey)keyFactory.generatePrivate(pkcs8KeySpec);
  84.         Signature sign = Signature.getInstance(signatureAl);//"SHA256withECDSA/"
  85.         sign.initSign(privateK);
  86.         sign.update(Base64.getDecoder().decode(content));
  87.         return Base64.getEncoder().encodeToString(sign.sign());
  88.     }


复制代码
回复

使用道具 举报

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

本版积分规则

教学服务系统

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

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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