我需要使用NIST P-256椭圆曲线来加密和解密数据。现在我已经生成了密钥对,但是如何使用它们来加密和解密呢?
官网上只说如何使用这个ec密钥对进行签名/验证,但我想知道如何使用这个ec密钥对进行加密/解密。
生成NIST P-256密钥对代码:
val kpg: KeyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore")
val parameterSpec =
KeyGenParameterSpec.Builder("container", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
.setAlgorithmParameterSpec(ECGenParameterSpec("secp256r1"))
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA384, KeyProperties.DIGEST_SHA512)
.build()
kpg.initialize(parameterSpec)
val keyPair = kpg.generateKeyPair()
val ecPublicKey = keyPair.public as ECPublicKey
val ecPrivateKey = keyPair.private as ECPrivateKey发布于 2019-08-24 08:36:44
AndroidKeyStore目前不支持使用EC密钥加密或解密,仅支持使用RSA密钥进行加密或解密。
要使用EC密钥进行加密,您需要使用ECDH加上密钥派生函数(KDF)来计算可用于数据的共享对称密钥,或者使用ECIES在内部执行此操作。但从Android10开始,AndroidKeyStore不支持这两种操作模式,可能在Android11中也是如此。
现在,您可以使用RSA和适当的填充模式(建议使用OAEP)来加密对称密钥,也可以使用原生Java加密提供程序。不幸的是,这将不会使用安全硬件来生成、存储或使用密钥,而是在应用程序的进程空间中执行所有这些操作。这里有一个here的例子。
(无论如何,我是拥有AndroidKeyStore的谷歌工程师。我计划添加ECDH支持已经有几年了,但它总是被其他被认为具有更高优先级的功能抢先一步。不过,我会找到它的。)
发布于 2019-07-18 17:49:46
加密时不建议使用公钥加密。通常的做法是混合加密,其中交换块密码密钥,然后执行对称加密。
密钥交换后,最常见的问题是认证和完整性。现代的做法是使用经过身份验证的加密模式作为AES-GCM。GCM模式为您提供身份验证和完整性。您可以看到一个实现here
https://stackoverflow.com/questions/57087599
复制相似问题