当前位置: 首页 > 知识库问答 >
问题:

RSA和AES用于加密和解密明文(验证密钥)

东门茂实
2023-03-14


我的进程:
1。生成对称密钥
2。使用对称密钥
3加密数据。使用RSA
4加密对称密钥。发送加密密钥和数据
5。使用RSA
6解密加密的对称密钥。使用对称密钥
7解密数据。已完成

import java.io.UnsupportedEncodingException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Arrays;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AES_RSA {

    private static byte[] key;
    private static SecretKeySpec secretKey;

    public static void main(String[] args){
        try {

            //1. Generate Symmetric Key (AES with 128 bits)
            String password = "123456";
            KeyGenerator generator = KeyGenerator.getInstance("AES");
            generator.init(128); // The AES key size in number of bits

            setKey(password);

            //2. Encrypt plain text using AES
            String plainText = "Please encrypt me urgently...";
            Cipher aesCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            aesCipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());

            //3. Encrypt the key using RSA public key
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(2048);
            KeyPair keyPair = kpg.generateKeyPair();

            PublicKey puKey = keyPair.getPublic();
            PrivateKey prKey = keyPair.getPrivate();

            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.PUBLIC_KEY, puKey);
            byte[] encryptedKey = cipher.doFinal(secretKey.getEncoded()/*Seceret Key From Step 1*/);

            //4. Send encrypted data (byteCipherText) + encrypted AES Key (encryptedKey)
            //5. On the client side, decrypt symmetric key using RSA private key
            cipher.init(Cipher.PRIVATE_KEY, prKey);
            byte[] decryptedKey = cipher.doFinal(encryptedKey);

            //6. Decrypt the cipher using decrypted symmetric key
            SecretKey originalKey = new SecretKeySpec(decryptedKey , 0, decryptedKey.length, "AES");
            Cipher aesCipher1 = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            aesCipher1.init(Cipher.DECRYPT_MODE, originalKey);
            byte[] bytePlainText = aesCipher1.doFinal(byteCipherText);
            String plainText1 = new String(bytePlainText);

            //7. Done! 'Please encrypt me urgently...'
            System.out.println(plainText1);

        }catch (Exception e) {}
    }


    public static void setKey(String myKey)
    {
        MessageDigest sha = null;
        try {
            key = myKey.getBytes("UTF-8");
            sha = MessageDigest.getInstance("SHA-256");
            key = sha.digest(key);
            key = Arrays.copyOf(key, 16);
            secretKey = new SecretKeySpec(key, "AES");
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

共有1个答案

卞云瀚
2023-03-14

你的伪步骤是正确的,但你的描述不是。例如,您通常保留RSA私钥,并分发RSA公钥。

而是一些创建更好代码的建议。

>

  • 我建议使用pkcs5来创建基于密码的密钥,而不是简单的哈希。Java的pbekeyspec是一个用于生成此类密钥的类。下面是一个小的示例代码,您可以将其用于setkey()例程(根据需要进行调整):

    SecretKeyFactory skf = SecretKeyFactory.getInstance("AES");
    SecretKey key = skf.generateSecret(new PBEKeySpec(password.getBytes("UTF-8"), salt, 10000));
    

  •  类似资料:
    • 本文向大家介绍Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签,包括了Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签的使用技巧和注意事项,需要的朋友参考一下 Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签,具体代码如下所示: ps:Python3 RSA加密

    • 这是我的密码 抱歉,如果我的代码一团糟。

    • 问题内容: 我迅速编写了一个应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案中接收了加密数据,但是我找不到解决办法。 这是我的.net加密: 我需要迅速解密功能。 问题答案: 我找到了解决方案,它是一个很好的库。 跨平台256位AES加密/解密。 此项目包含在所有平台(C#,iOS,Android)上均可使用的256位AES加密的实现。关键目标之一是通过简单的实现使AES在所有平台

    • 问题内容: 我想使用128位AES加密和16字节密钥对密码进行加密和解密。解密值时出现错误。解密时我丢失任何内容吗? 错误信息 最后我基于@QuantumMechanic答案使用以下解决方案 } 问题答案: 如果对于块密码,您将不使用包含填充方案的转换,则需要使明文中的字节数为该密码的块大小的整数倍。 因此,要么将纯文本填充到16字节的倍数(即AES块大小),要么在创建对象时指定填充方案。例如,您

    • 我有这段代码,它基本上对两条纯文本消息进行加密,然后尝试解密,然后打印。问题是第一条消息恢复得很好,但第二条消息是垃圾。我从本教程下载了这段代码,然后将其修改为使用字符串而不是文件,因为我需要它通过套接字发送加密文本。所以其他endpoint不知道明文的长度,有没有办法找到长度,或者我必须以某种方式将明文的长度与密码一起发送? 现在,我认为解密的中断条件有问题。 另外,main()代码在概念上是否

    • 我当前在解密服务器上的RSA加密数据时遇到了问题,服务器使用Node.js并使用node-rsa库进行加密/解密。 在我的Android客户端上没有任何问题地接收到公钥,但是当尝试解密数据时,我得到了以下异常: 这就是我在客户端上生成公钥的方式 以下是客户端的加密: