我在CBC模式提供程序中使用带AES的弹性城堡ECIES来加密数据:
Cipher iesCipher = Cipher.getInstance("ECIESWITHAES-CBC");
iesCipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] ciphertext = iesCipher.doFinal(plaintext);
这将产生一个格式为的密文
0x04 || coordinate x || coordinate y || PKCS5 padded ciphertext || 20-byte HMAC-digest
0x04
表示未压缩的格式,其中还存储y坐标。使用例如secp256k1,这会导致32字节的不必要开销。
现在我想使用带有0x02
和0x03
前缀的压缩格式。
不幸的是,我并没有找到实现这一目标所需的参数规范。
我通过将BCIESParameterSpec
中的usePointCompression
标志设置为true
来解决此问题。
默认情况下,点压缩标志为false。
不幸的是,这个标志不是他们ECIESTest的一部分,所以我使用了他们的加密模式配置(派生、编码和初始化向量(来尝试这个标志:
byte[] derivation = Hex.decode("202122232425262728292a2b2c2d2e2f");
byte[] encoding = Hex.decode("303132333435363738393a3b3c3d3e3f");
byte[] nonce = Hex.decode("000102030405060708090a0b0c0d0e0f");
Cipher c = Cipher.getInstance("ECIESwithAES-CBC", "BC");
IESParameterSpec params = new IESParameterSpec(derivation, encoding, 128, 128, nonce, true);
c.init(Cipher.ENCRYPT_MODE, publicKey, params);
byte[] ciphertext = c.doFinal(plaintext);
这会产生所需的格式:
0x02 || coordinate x || PKCS5 padded ciphertext || 20-byte HMAC-digest
0x03 || coordinate x || PKCS5 padded ciphertext || 20-byte HMAC-digest
取决于相应的y坐标(正/负(。