gpt4 book ai didi

java - 我应该使用 Cipher.WRAP_MODE 或 Cipher.ENCRYPT_MODE 来加密 session key 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 08:10:01 24 4
gpt4 key购买 nike

我应该如何使用从服务器端传输的公钥在客户端加密 session key ?

我应该使用 Cipher.WRAP_MODE 还是 Cipher.ENCRYPT_MODE

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.WRAP_MODE, publicKey);
byte[] wrappedSessionKey = cipher.wrap(sessionKey);

我不太确定如何使用 encrypt_mode 来加密 sessionKey。有人可以帮我解决这个问题吗?

最佳答案

包装和加密非常相似,但是包装更准确地表达了您打算做什么。一般的“加密”对没有语义意义的原始数据进行操作,而包装与 key 有关。因此 Cipher.unwrap() 方法返回一个 Key 而不是字节数组。

如果您使用 wrap 进行 key 包装,您的代码将更具可移植性(特别是在硬件安全模块方面)。在某些情况下, key 权限将允许包装操作,但不允许对 key 字节进行原始加密。

当然,由于整个 JCE 体系结构都基于 provider 概念,因此您需要准确检查为所选提供程序指定的算法以获得所需的输出格式。如果您要将包装的 key 数据发送给第三方,这一点尤为重要。


在您的特定情况下,WRAPENCRYPT 都会表现出相同的行为,如下所示,我将在其中交换结果:

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SunJSSE");
generator.initialize(2048);
KeyPair keyPair = generator.generateKeyPair();

SecretKey sessionKey = new SecretKeySpec(new byte[16], "AES");

Cipher c = Cipher.getInstance("RSA", "SunJCE");
c.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
byte[] result1 = c.doFinal(sessionKey.getEncoded());

c.init(Cipher.WRAP_MODE, keyPair.getPublic());
byte[] result2 = c.wrap(sessionKey);

c.init(Cipher.UNWRAP_MODE, keyPair.getPrivate());
SecretKey sessionKey1 = (SecretKey) c.unwrap(result1, "AES",
Cipher.SECRET_KEY);

c.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
SecretKey sessionKey2 = new SecretKeySpec(c.doFinal(result2), "AES");

System.out.println(Arrays.equals(sessionKey1.getEncoded(),
sessionKey2.getEncoded()));

这会打印:true

关于java - 我应该使用 Cipher.WRAP_MODE 或 Cipher.ENCRYPT_MODE 来加密 session key 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586627/

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