java - AES key 加解密与RSA key

标签 java encryption cryptography aes rsa

我必须生成 AES key ,并且我有用于聊天应用程序的 RSA key 对。我必须用 AES key 加密消息,然后用公共(public) RSA key 加密 AES key 。之后,用户使用 RSA 私钥解密 AES key ,并使用给定的 AES key 解密消息。我测试了我的代码,但在使用公钥和私钥加密和解密后,我得到了不同的 AES key 。

我认为我在使用 Base64 编码/解码或使用某些关键函数(如 key.getEncodec 或 key.toString 方法)时遇到问题。

这是我的代码

public void sendMessage(User receiver, String message) throws Exception {

    //Generate AES key for encrypt message
    KeyGenerator keyGenerator=KeyGenerator.getInstance("AES");
    Integer keyBitSize=256;
    keyGenerator.init(keyBitSize);
    SecretKey simKey=keyGenerator.generateKey();
    System.out.println("AES KEY: "+simKey.getEncoded()+"\n");

    //Encrypt message
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, simKey);
    byte[] encMess1=cipher.doFinal(message.getBytes("UTF-8"));
    String messToWrite=Base64.getEncoder().encodeToString(encMess1);

    //Encrypt AES key
    byte[] KeyToEnc=simKey.getEncoded();
    cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.ENCRYPT_MODE, receiver.getPub());
    cipher.update(KeyToEnc);
    byte[] AESEncWrt=cipher.doFinal();
    String aeskeyString=new String(Base64.getEncoder().encodeToString(AESEncWrt));
    System.out.println("AES ENC:"+aeskeyString+"\n");

    //Decrypt AES key
    byte[] KeyToDec=Base64.getDecoder().decode(aeskeyString.getBytes());
    cipher.init(Cipher.DECRYPT_MODE, receiver.getPriv());
    cipher.update(KeyToDec);
    byte[] decAesKey=cipher.doFinal();
    System.out.println("AES DEC: "+decAesKey+"\n");


    //Write message and AES key in file
    BufferedWriter messFile=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+".txt"));
    System.out.println("WRITING TO FILE:"+messToWrite+"\n");
    messFile.write(messToWrite);
    messFile.close();
    BufferedWriter aeswrite=new BufferedWriter(new FileWriter(receiver.getInbox()+"/"+getUsername()+"key.txt"));
    System.out.println("WRT KEY:"+aeskeyString+"\n");
    aeswrite.write(aeskeyString);
    aeswrite.close();

    System.out.println("-------------------------------");
}

抱歉,如果我的代码一团糟。

最佳答案

当你这样做时:

System.out.println("AES KEY: "+simKey.getEncoded()+"\n");

您不打印键的内容,而只是打印一个指向字节数组的“指针”。当您解密时,您最终会得到一个带有不同“指针”的新 byte[]

您需要打印实际内容,例如十六进制。 Java 对十六进制打印的支持有限,但是像这样的东西会给你字节数组的十六进制表示:

System.out.println(new BigInteger(1, simKey.getEncoded()).toString(16)); 

请注意代码中还有其他问题 - 比如您忽略了 cipher.update(..) 返回的 byte[] 的使用ECB 模式与 AES ..

关于java - AES key 加解密与RSA key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60811249/

相关文章:

java - 根据某些配置参数从代码中禁用缓存抽象

c# - 加密的 zip 文件也可以保护其内部目录吗

sql-server-2008 - Sql Server 将 SHA256 字符串存储为问号

java - 将 Json 字符串转换为 JsonObject

java - 求二维数组中某一列的平均值并将结果放入另一个矩阵中

java - 如何在微服务架构(HAL、ALPS)中为 Restful 服务正确设置文档

php - 我如何解码 laravel 5 中的哈希值?

c++ - 使用 Apache XML Security C++ (XSec) 封装和分离 XML 签名

c++ - RSA 函数生成公钥 (e) 始终为 17

c - 如何检查 EVP_PKEY 是否包含私钥?