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

基于RSA密钥的AES密钥加解密

史商震
2023-03-14

这是我的密码

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("-------------------------------");
}

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

共有1个答案

华凡
2023-03-14

当您执行此操作时:

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

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

您需要打印实际内容,例如十六进制。Java对十六进制打印的支持有限,但类似的内容将为您提供字节数组的十六进制表示:

System.out.println(new BigInteger(1, simKey.getEncoded()).toString(16)); 
 类似资料:
  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(

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

  • 我正在使用Safenet HSM(硬件安全模块)来存储我的加密密钥,并且我正在尝试使用JavaAPI和SunPKCS11解包使用RSA加密的密钥(AES/DES)。我想安全地执行此操作,以便无法从HSM中提取解包的AES/DES密钥(就像RSA私钥值是不可见的)。但是,在解包后,解包密钥的值在HSM之外的密钥对象中是可见的。 这是我的代码: 如何告诉代码不要泄露未包装的密钥?我必须在PKCS11配

  • 但这总是给我以下的例外- 我的键盘生成逻辑- 我的加密逻辑- Base64 Util方法-

  • 我正在使用OpenSSL RSA API用服务器的公钥加密数据。 我使用的是,所以RSA应该可以轻松地用256字节的公钥加密255字节。但我收到了: 我改变dl(data_lenght)到256(只有1),我得到了这个: 我知道RSA可以用256个密钥编码255个字节。有什么问题吗?