【发布时间】:2022-01-02 16:53:08
【问题描述】:
Here我读到了关于如何使用非对称椭圆曲线加密来创建产品密钥的基本思想,这里引用:
我的问题是如何通过 128 位椭圆曲线创建产品密钥,因为如果您加密 X 长度的文本,您会得到比 X 长得多的加密?
下面是我写的测试代码,8个字符的消息加密成28个字节的数组,我哪里错了,还是根本不可能使用椭圆曲线来创建25个字符的产品密钥?
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System.Text;
using System.Linq;
using Org.BouncyCastle.Crypto.Engines;
using System.Diagnostics;
using Org.BouncyCastle.Crypto.Agreement;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Macs;
class Program
{
public static void Main(string[] args)
{
var keyPairGenerator = new ECKeyPairGenerator("ECDH");
var x9 = ECNamedCurveTable.GetByName("secp128r1");
keyPairGenerator.Init(new ECKeyGenerationParameters(new ECDomainParameters(x9), new SecureRandom()));
var keyPair = keyPairGenerator.GenerateKeyPair();
byte[] d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
byte[] e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
var p = new IesWithCipherParameters(d, e, 64, 128);
var cipher = new IesEngine(
new ECDHBasicAgreement(),
new Kdf2BytesGenerator(new Sha1Digest()),
new HMac(new Sha1Digest()));
var message = Encoding.UTF8.GetBytes("12345678");
cipher.Init(true, keyPair.Private, keyPair.Public, p);
var encryption = cipher.ProcessBlock(message, 0, message.Length); // encryption length is 28 <==
cipher.Init(false, keyPair.Private, keyPair.Public, p);
var decryption = cipher.ProcessBlock(encryption, 0, encryption.Length);
Debug.Assert(decryption.SequenceEqual(message));
}
}
【问题讨论】:
-
鉴于该示例使用 MD5 并指定直接 EC 加密(ElGamal?,如果不是,如何?)我会说这是一个非常糟糕的协议。 128 位 EC 也不安全。
-
@MaartenBodewes 忘了说要使用 ECIES 而不是 ECC 加密。 That has an encoding issue
-
是的,但是 ECIES 需要额外的数据,而示例表明用户必须输入 25 个字符,而不是更多。
-
尚不完全清楚,但似乎链接的答案实际上是提出签名而不是加密,但答案作者没有意识到这一点。作者讲的是在服务端用私钥“加密”,在客户端用公钥“解密”。
-
您没有定义要加密的密码。因此它使用streaming mode,并且有MAC要考虑大小。
标签: c# algorithm security encryption cryptography