练习:ECIES 加密 / 解密
编写一个程序,使用ECIES(椭圆曲线集成加密方案),通过公钥 / 私钥对消息进行加密 / 解密。加密需要 EC 公钥,解密需要对应的 EC 私钥。在内部实现中,可自行选择基于 256 位椭圆曲线(例如 brainpoolP256t1)的 ECC 密码学和对称加密算法(例如 AES-256-CTR + MAC、AES-128-GCM 或 ChaCha20-Poly1305),以及密钥派生函数(例如 PBKDF2)。
你可以按照 SECG-SEC-1 标准编写自己的 ECIES 实现,也可以使用相应编程语言的标准 ECIES 库,例如:
- Python: https://pypi.org/project/eciespy
- JavaScript: https://github.com/bitchan/eccrypto
- C#: https://github.com/VirgilSecurity/virgil-sdk-crypto-net
- Java: https://github.com/Arryboom/smartbox-ecies-java
- C, C++, PHP, Perl: https://github.com/jedisct1/libsodium
ECIES 加密
编写一个程序,使用 ECIES 混合加密方案和 256 位 ECC 公钥 (2 * 256 bits) 加密消息。
- 输入由十六进制公钥(第一行,未压缩,128 个十六进制数字)+ 用于加密的明文消息(第二行)组成。
- 输出是十六进制编码的加密消息。它可能包含 ECC 密文公钥 + 密文 + MAC 码 + 对称密钥算法参数,但具体内容在很大程度上取决于底层算法和实现。
输入示例:
552e2b308514b38e4989d71ed263e0af6376f65ba81a94ebb74f6fadc223ee80aa8fb710cfb445e0871cd1c1a0c1f2adb2b6eedc2a0470b04244548c5be518c8
Sample text for ECIES encryption.
输出示例:
由于加密方案具有随机性,每次执行程序得到的结果都会不同:
0442e2fba3fddba1ba9207f3276e141809782dc72529523aa1fcf35b15c4c22a9333ddacd7d64de4abd0a36138d430c50be7a98d5512cb8c2fe36ca45a0bbd7927c150ae3637c45093207531ce75e3841d4808ced85e82305d8da891708c20479388f6d4a7cde213bb36bf860c5df0077358a942eeb9a4c23e89bcc11f11
ECIES 解密
编写一个程序,使用 ECIES 混合加密方案和 256 位 ECC 私钥,解密由上一个示例程序生成的加密消息。
- 输入由十六进制私钥(第一行,64 个十六进制数字)+ 要解密的加密消息(第二行)组成。
- 输出是解密后的明文消息。如果出现解密问题(例如解密密钥不正确或加密消息损坏),则显示
Error: cannot decrypt the message。
输入示例:
27f07d3251dee39ec2c5ff800641f4d839e6f8065033e9a710ea2e519473bdd7
0442e2fba3fddba1ba9207f3276e141809782dc72529523aa1fcf35b15c4c22a9333ddacd7d64de4abd0a36138d430c50be7a98d5512cb8c2fe36ca45a0bbd7927c150ae3637c45093207531ce75e3841d4808ced85e82305d8da891708c20479388f6d4a7cde213bb36bf860c5df0077358a942eeb9a4c23e89bcc11f11
输出示例:
Sample text for ECIES encryption.
输入示例:
此示例包含一个不正确的解密私钥:
9ab686c269b2c58f0fca699dde09cf24e23353e56bd60095d681b23709cb0dc3
0442e2fba3fddba1ba9207f3276e141809782dc72529523aa1fcf35b15c4c22a9333ddacd7d64de4abd0a36138d430c50be7a98d5512cb8c2fe36ca45a0bbd7927c150ae3637c45093207531ce75e3841d4808ced85e82305d8da891708c20479388f6d4a7cde213bb36bf860c5df0077358a942eeb9a4c23e89bcc11f11
输出示例:
Error: cannot decrypt the message