gpt4 book ai didi

java - 使用 RSA 公钥和私钥加密和解密 SecretKey

转载 作者:行者123 更新时间:2023-12-02 03:52:54 26 4
gpt4 key购买 nike

我试图用我的公钥加密一个secretKey,然后用私钥在其他地方解密它。我可以很好地加密和解密,但是当我这样做时,我得到了一个完全不同的 key 。

这是创建公钥/私钥对的代码

public static KeyPair generateKeyPair()
{
KeyPair returnPair = null;
try
{
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "SunJSSE");

System.out.println("provider:" + kpg.getProvider().getName());

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

kpg.initialize(1024, random);

returnPair = kpg.generateKeyPair();

}catch(Exception e)
{
e.printStackTrace();
}
return returnPair;
}

我指定了 SunJSSE 提供程序,尽管与使用 SunJCE 或 RSA/SunRSASign 提供程序运行 DiffieHellman 时相比,我没有得到任何不同的结果。我对 java 安全性很陌生,所以这些概念仍然有点超出我的理解。

这是我用来生成 key 的代码

    public static SecretKey generateSecretKey(String keyPassword)
{
SecretKey key = null;
try
{
SecretKeyFactory method = SecretKeyFactory.getInstance("PBEWithMD5AndDES");

//System.out.println("salt length: " + new SaltIVManager().getSalt().length);

PBEKeySpec spec = new PBEKeySpec(keyPassword.toCharArray(), new SaltIVManager().getSalt(), 10000, 128);

key = method.generateSecret(spec);

System.out.println("generate secret key length: " + key.getEncoded().length);

}catch(Exception e)
{
e.printStackTrace();
}
return key;
}

这是我用来加密/解密我的 key 的两种方法

    public static byte[] encryptSecretKey(SecretKey secretKey, PublicKey publicKey)
{
byte[] encryptedSecret = null;
try
{

Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING");

System.out.println("provider: " + cipher.getProvider().getName());

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

System.out.println("original secret key: " + Base64.getEncoder().encodeToString(secretKey.getEncoded()) + " \n secretkey encoded length: " + secretKey.getEncoded().length);

encryptedSecret = cipher.doFinal(secretKey.getEncoded());


System.out.println("encrypted secret: " + Base64.getEncoder().encodeToString(encryptedSecret));

}catch(Exception e)
{
e.printStackTrace();
}
return encryptedSecret;
}



public static SecretKey decryptSecretKey(byte[] encryptedKey, PrivateKey privateKey)
{
SecretKey returnKey = null;
try
{
Cipher cipher = Cipher.getInstance("RSA/ECB/NOPADDING");

System.out.println("provider: " + cipher.getProvider().getName());

cipher.init(Cipher.DECRYPT_MODE, privateKey);

System.out.println("encryptedkey length: " + encryptedKey.length);

byte [] encodedSecret = cipher.doFinal(encryptedKey);

System.out.println("encoded Secret after decrypt: " + Base64.getEncoder().encodeToString(encodedSecret));

returnKey = new SecretKeySpec(encodedSecret, 0, encodedSecret.length, "PBEWithMD5AndDES");

System.out.println("secret key: " + Base64.getEncoder().encodeToString(returnKey.getEncoded()));

System.out.println("secret key length post decrypt: " + returnKey.getEncoded().length);
}catch(Exception e)
{
e.printStackTrace();
}
return returnKey;
}

RSA 算法是我能使用我的 key 的唯一算法。如果我指定 DiffieHellman 算法。对于 key 对,我根本无法加密/解密。如果有人对我做错了什么有任何见解,任何帮助将不胜感激。当我在当前状态下调用它时,我以该值 = cGFzczEyMw== 的 key 开始,并在加密/解密后以该值的 key 结束

SvMNufKu2JA4hnNEwuWdOgJu6FxnNmuLYzxENhTsGgFzc/i3kQIXbeVaJUkJck918BLCnm2u2QZCyVvJjYFXMLBFga0Zq0WMxSbIZvPz1J/EDi9dpsAkbFhLyBWmdDyPr+w7DMDsqHwKuA8y/IRKVINWXVrp3Hbt8goFZ0nGIlKVzMdJbGhNi3HZSAw4R6fXZNKOJ3nN6wDldzYerEaz2MhJqnZ3Dz4psA6gskomhjp/G0yhsGO8pllMcgD0jzhL86RGrBhjj04Bj0ps3AAACkQLcCwisso8dWigvR8NX9dnI0C/gc6FqmNenWI1/AoPgmcRyFdlO7A2i9JXoSj+YQ==

最佳答案

在做之前你首先应该知道你要做什么:

  • 没有填充的 RSA 是完全不安全的;
  • 您使用基于密码的加密 key ,该 key 只​​有在使用密码时才有意义;
  • 您获得了 DES key ,这又是完全不安全的;
  • 您可能使用随机的盐生成它,因此输出也是随机的。

整个协议(protocol)没有意义。您尝试直接使用 DH(一种执行 key 协商的方案)进行加密,这表明您对加密技术的研究还不够。

对于密码学来说,它并不是让事情正常运转。这是为了让事情安全。你不能仅仅通过尝试来做到这一点。至少学习密码学的基础知识然后编码

关于java - 使用 RSA 公钥和私钥加密和解密 SecretKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35727710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com