java rsa私钥加密

Python015

java rsa私钥加密,第1张

java rsa私钥加密是什么?让我们一起来了解一下吧!

java rsa私钥加密是一种加密算法。私钥加密算法是用私钥来进行加密与解密信息。私钥加密也被称作对称加密,原因是加密与解密使用的秘钥是同一个。

RSA加密需要注意的事项如下:

1. 首先产生公钥与私钥

2. 设计加密与解密的算法

3. 私钥加密的数据信息只能由公钥可以解密

4. 公钥加密的数据信息只能由私钥可以解密

实战演练,具体步骤如下: public class RsaCryptTools {     private static final String CHARSET = "utf-8"     private static final Base64.Decoder decoder64 = Base64.getDecoder()     private static final Base64.Encoder encoder64 = Base64.getEncoder()       /**      * 生成公私钥      * @param keySize      * @return      * @throws NoSuchAlgorithmException      */     public static SecretKey generateSecretKey(int keySize) throws NoSuchAlgorithmException {         //生成密钥对         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA")         keyGen.initialize(keySize, new SecureRandom())         KeyPair pair = keyGen.generateKeyPair()         PrivateKey privateKey = pair.getPrivate()         PublicKey publicKey = pair.getPublic()         //这里可以将密钥对保存到本地         return new SecretKey(encoder64.encodeToString(publicKey.getEncoded()), encoder64.encodeToString(privateKey.getEncoded()))     }     /**      * 私钥加密      * @param data      * @param privateInfoStr      * @return      * @throws IOException      * @throws InvalidCipherTextException      */     public static String encryptData(String data, String privateInfoStr) throws IOException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {           Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")         cipher.init(Cipher.ENCRYPT_MODE, getPrivateKey(privateInfoStr))         return encoder64.encodeToString(cipher.doFinal(data.getBytes(CHARSET)))     }       /**      * 公钥解密      * @param data      * @param publicInfoStr      * @return      */     public static String decryptData(String data, String publicInfoStr) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {         byte[] encryptDataBytes=decoder64.decode(data.getBytes(CHARSET))         //解密         Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")         cipher.init(Cipher.DECRYPT_MODE, getPublicKey(publicInfoStr))         return new String(cipher.doFinal(encryptDataBytes), CHARSET)     }     private static PublicKey getPublicKey(String base64PublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(base64PublicKey.getBytes()))         KeyFactory keyFactory = KeyFactory.getInstance("RSA")         return keyFactory.generatePublic(keySpec)     }     private static PrivateKey getPrivateKey(String base64PrivateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {         PrivateKey privateKey = null         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(base64PrivateKey.getBytes()))         KeyFactory keyFactory = null         keyFactory = KeyFactory.getInstance("RSA")         privateKey = keyFactory.generatePrivate(keySpec)         return privateKey     }       /**      * 密钥实体      * @author hank      * @since 2020/2/28 0028 下午 16:27      */     public static class SecretKey {         /**          * 公钥          */         private String publicKey         /**          * 私钥          */         private String privateKey           public SecretKey(String publicKey, String privateKey) {             this.publicKey = publicKey             this.privateKey = privateKey         }           public String getPublicKey() {             return publicKey         }           public void setPublicKey(String publicKey) {             this.publicKey = publicKey         }           public String getPrivateKey() {             return privateKey         }           public void setPrivateKey(String privateKey) {             this.privateKey = privateKey         }           @Override         public String toString() {             return "SecretKey{" +                     "publicKey='" + publicKey + '\'' +                     ", privateKey='" + privateKey + '\'' +                     '}'         }     }       private static void writeToFile(String path, byte[] key) throws IOException {         File f = new File(path)         f.getParentFile().mkdirs()           try(FileOutputStream fos = new FileOutputStream(f)) {             fos.write(key)             fos.flush()         }     }       public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, IOException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, InvalidKeySpecException {         SecretKey secretKey = generateSecretKey(2048)         System.out.println(secretKey)         String enStr = encryptData("你好测试测试", secretKey.getPrivateKey())         System.out.println(enStr)         String deStr = decryptData(enStr, secretKey.getPublicKey())         System.out.println(deStr)         enStr = encryptData("你好测试测试hello", secretKey.getPrivateKey())         System.out.println(enStr)         deStr = decryptData(enStr, secretKey.getPublicKey())         System.out.println(deStr)     }   }

密钥是一组字符,比如"QWE12312SDA"。

只有获得密钥才能进行加解密,比如我希望只有你才能解密我的加密的密文,那么我把密钥告诉你,就算其他人获取了密文和解密算法,也只有你才能解密。

3DES算法是指使用双长度(16字节)密钥K=(KL||KR)将8字节明文数据块进行3次DES加密/解密。如下所示: Y = DES(KL)[DES-1(KR)[DES(KL[X])]] 解密方式为: X = DES-1 (KL)[DES (KR)[ DES-1 (KL[Y])]] 其中,DES(KL[X])表示用密钥K对数据X进行DES加密,DES-1 (KL[Y])表示用密钥K对数据Y进行解密。 SessionKey的计算采用3DES算法,计算出单倍长度的密钥。表示法为:SK = Session(DK,DATA) 3DES加密算法为: VOID 3DES(BYTE DoubleKeyStr[16], BYTE Data[8], BYTE Out[8]) { BYTE Buf1[8], Buf2[8]DES (&DoubleKeyStr[0], Data, Buf1)UDES(&DoubleKeyStr[8], Buf1, Buf2)DES (&DoubleKeyStr[0], Buf2, Out)}