使用ECDH公钥进行密钥包装?

Ti Strga:

前言:我不知道在这里还是在Crypto网站上问这个问题是否更合适。随意移动或删除或执行任何适当的SE操作。


我被要求帮助更新一些加密软件。从广义上讲,该软件已经执行了以下步骤,这些步骤都不是特别不寻常的。Provider为了简化发布,我省略了错误处理和参数:

1)生成一个随机对称密钥,用于AES-128(或比照 AES-256 ):

KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init (128, a_SecureRandom_instance);
SecretKey sessionKey = keygen.generateKey();

2)包装对称密钥,具体取决于用户是否使用...
2a)...来自密钥对的RSA公钥:

// OAEP wasn't used in this software for hysterical raisins
Cipher wrapper = Cipher.getInstance("RSA/ECB/PKCS1Padding");
wrapper.init (Cipher.WRAP_MODE, user_RSA_PublicKey);

2b)...一个密码短语:

SecretKey stretched = ...passphrase stretched through a PBKDF like bcrypt...;
// I don't remember whether it's specified as "AES" or "AESWrap" here
Cipher wrapper = Cipher.getInstance("AES or AESWrap/ECB/NoPadding");
wrapper.init (Cipher.WRAP_MODE, stretched);

2c)无论哪种路由,会话密钥都被包装:

byte[] wrapped = wrapper.wrap(sessionKey);

3)会话密钥被用来创建一个Cipher使用Cipher.ENCRYPT_MODE连同随机IV,然后数据的shedloads通过它运行。该部分是非常标准的,但是如果您真的想查看CipherInputStream使用情况,可以将其发布包装的会话密钥与加密的数据以及在阳光下所有事物的一堆HMAC一起存储。

稍后在解密时,用户提供RSA私钥或用于扩展的密码。软件将解开对称密钥并解密数据。

所有这些已经工作了一段时间。但是,当然,RSA密钥对变得越来越大且越来越慢,因此它们希望支持上述步骤2的其他可能性,其中使用椭圆曲线算法生成公钥(P384 ECDH是常见情况)。这就是我们感到困惑的地方。

Cipher wrapper = Cipher.getInstance("RSA/ECB/PKCS1Padding")调用中似乎没有用于椭圆曲线的JCE替换算法/转换Java文档中列出的唯一一个是“ ECIES”,似乎更倾向于多方密钥协议?

我为Java内置JCE甚至查找Bouncy Castle所能找到的所有API,仅在密钥协议和传输的上下文中提及ECDH密钥,在这些协议中,它们用于生成对称密钥,而不是包装现有密钥之一。

我觉得我们在这里遗漏了一些东西,可能是由于错误的假设。Cipher.wrap()真的不ECDH键的选项?或者,但是我们需要做一些时髦的事才能创建ECIES Cipher实例吗?

dave_thompson_085:

RSA是用于加密和签名的算法(或取决于您的外观,这是两个非常相似但截然不同的算法)。RSA加密可以加密dat,它是一个(较低级别的)密钥,在这种情况下,它称为包装。

DH是一种关键协议算法,无论是经典形式(aka整数,Zp,modp或有限域/ FF)形式还是椭圆曲线形式(ECDH)都可以使用。请注意,至少对于经典DH而言,原始协议值g ^ a ^ b mod n = g ^ b ^ a mod n具有足够的数学结构,人们不习惯直接将其用作键,因此我们通过键派生来运行它功能,缩写为KDF。我不清楚ECDH值是否确实需要KDF,至少对于包括P384在内的常用X9 / NIST曲线(如果您愿意,可以在crypto.SX上查询或询问),但使用KDF便宜且行之有效我们这样做。

我从来没有听说过有人称呼(EC)DH密钥传输,因为它不是。列入重点交换,建立包括交通和协议(有用的)工会的术语。

您可以创建一个加密方案使用(EC)DH通过同意(并派生)值作为对称加密的密钥-这(EC)IES。我不知道是什么让您认为IES是另一回事。现代实践是应该对对称加密进行身份验证,并且作为独立方案的IES的标准化形式使用带有HMAC身份验证的CBC加密,尽管您可以有效地设计使用例如GCM的方案。

如您所见,BouncyCastle提供程序提供了DH(经典)或EC IES“带有{AES,DESEDE} -CBC”的实现(在1.56之前的版本中,有时省略了-CBC),该实现使用了P1363a中的KDF2和SHA1(表示为CBC)密码和HMAC-SHA1。“标准”(Sun / Oracle / Open)提供程序没有提供,但是您可以将原始协议操作,KDF,对称加密和MAC结合使用以产生相同的结果。

这是类似的(在一些细节上,虽然不同)来操作CMS-以前-PKCS7经典DH 和ECDHPGP与ECDH(PGP不支持经典DH;它使用ElGamal加密替代RSA。)更不用说TLS(有时通过1.2,始终在1.3中)和SSH,它们使用经典或EC DH“交换”(此处是交互的,通常是短暂的,而不是至少使接收者具有静态的身份)来生成一个秘密,该秘密被导出并用作用于对数据进行身份验证的对称加密的密钥材料。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Java

SubjectPublicKeyInfo进行转换为Java公钥

来自分类Java

如何生成公钥的专用密钥在X25519?

来自分类Java

使用公钥验证签名

来自分类Java

使用RSA公钥加密AES密钥

来自分类Java

RSA在Android中使用base64编码的公钥进行加密

来自分类Java

Maven不会使用公钥进行部署

来自分类Java

使用xml中的公钥进行javax.xml.crypto.dsig验证

来自分类Dev

如何使用OpenSSL提取公钥?

来自分类Dev

从EVP_PKEY密钥对中提取公钥?

来自分类Dev

使用PHP + Curl进行TLS公钥固定?

来自分类Dev

C#BouncyCastle-使用公钥/私钥进行RSA加密

来自分类Dev

使用ECDH密钥的CMS_encrypt

来自分类Dev

检查输入的公钥是否是有效的OpenPGP密钥

来自分类Dev

RSACryptoServiceProvider使用自己的公钥和私钥进行加密和解密

来自分类Dev

使用Libssh2 C ++进行SSH公钥身份验证

来自分类Dev

如何在不使用密钥服务器的情况下从OpenPGP智能卡获取公钥?

来自分类Dev

分离ECDSA密钥对的公钥和私钥

来自分类Dev

GitLab SSH密钥-权限被拒绝(公钥)

来自分类Dev

在PHP中将openssl密钥转换为rsa公钥

来自分类Dev

在Apache Nifi中使用公钥进行RSA数字签名验证

来自分类Dev

在python和.net上使用单个公钥进行加密的不同答案

来自分类Dev

如何使用OpenSSL EVP例程进行RSA公钥加密?

来自分类Dev

ECDH上的公钥长度应为多少?

来自分类Dev

非对称加密算法,允许使用公钥和私钥进行加密和解密

来自分类Dev

在Android(Java / Kotlin)上获取X.509证书ECDH私钥和公钥

来自分类Dev

获取GPG公钥的密钥签名/指纹

来自分类Dev

OpenSSL:使用ECC公钥加密对称密钥

来自分类Dev

使用TSS.NET在TPM2上进行公钥加密

来自分类Dev

Terraform从非对称KMS密钥对获取公钥

TOP 榜单

热门标签

归档