WinAPI -> CryptoAPI -> RSA,使用私钥加密,使用公钥解密

4

您好。

我需要教授如何使用Windows CryptoAPI利用私有(而不是公共)密钥加密消息并使用公开密钥进行解密。这是为了向用户提供他们可以阅读但无法更改的信息。

目前的工作方式:

我获取上下文

CryptAcquireContext(@Prov, PAnsiChar(containerName), nil, PROV_RSA_FULL, 0)

生成密钥对
CryptGenKey(Prov, CALG_RSA_KEYX, CRYPT_EXPORTABLE, @key)

加密(问题在于这里。"key" - 一个密钥对,函数使用其公共部分);

CryptEncrypt(key, 0, true, 0, @res[1], @strLen, buffSize)

解密(这里也是同样的问题,它使用密钥的私有部分)

CryptDecrypt(key, 0, true, 0, @res[1], @buffSize)

感谢您的关注和帮助。

更新

是的,我可以使用数字签名和其他方法...

问题在于我需要加密一个数据库字段,并确保除我之外没有人能够更改它。只有通过我的程序才能读取此字段(直到有人反编译并获得公钥为止)。这可以使用对称密钥和数字签名来完成,但那么我将需要创建另一个字段并存储另一个密钥等等...

我真的希望我们可以以某种方式教WIN API按照我的要求执行操作。我知道我可以使用RSA实现这一点,并希望WinAPI以某种方式支持此功能。

2个回答

3
严格来说,在签署消息时:
- 拥有私钥的人使用他们的私钥对哈希值进行解密。 - 然后将“解密”的哈希值与消息一起发送。 - 接收者随后使用公钥对签名进行加密。
如果“加密”的哈希值与原始消息的哈希值匹配,则可以确定该消息未被更改,并且是由拥有私钥的人发送的。以下伪代码表示签名算法:
//Person with private key generating message and signature
originalHash = GenerateHashOfMessage(message);
signature = RsaDecrypt(originalHash, privateKey);

//Receiver validating signed message
hash = GenerateHashOfMessage(message);
originalHash = RsaEncrypt(signature, publicKey);
messageValid = (hash == originalHash);

这个机制可以用来实现你想要的功能,除了你不在意哈希,你只是想加密一些(小量的)数据:

//Person with private key
cipherText = RsaDecrypt(plainText, privateKey);

//Person with public key
plainText = RsaEncrypt(cipherText, publicKey);

我将把 CryptoAPI 的调用作为一个练习留给你,因为我仍在尝试理解微软的 Crypto API。

2
使用私钥加密数据,公钥解密数据是不被支持的,因为任何拥有“已发布”公钥的人都可以解密它。那么加密它有什么价值呢?
如果您想要验证数据没有被更改,您需要对数据进行签名。签名使用私钥对数据的哈希值进行加密。请查看签名函数。
您可能可以通过修改签名函数来实现您想要的功能。我曾经在其他实现中做过这个,但我还没有尝试过Microsoft CryptoAPI。
此外,请注意,在RSA加密中,明文消息的长度不能超过密钥长度。因此,如果您使用2048位密钥,则只能加密高达256字节(减去一些开销)的消息正文。
考虑使用非对称加密传递对称密钥,并使用对称密钥加密和解密任何大小的数据。
更新:
您可能可以使用CryptSignHash()函数来实现这一点。通常,这用于“签署”哈希值,但您可以将任何数据放入哈希中:
使用CryptSetHashParam中dwParam参数的HP_HASHVAL值在哈希对象中设置哈希值。如果输入预期为SHA1哈希值,则可能会受到字节数限制。另外,您可以考虑使用OpenSSL。如果我没记错的话,使用其RSA签名功能用私钥进行加密非常简单。我还使用旧版(免费版)的SecureBlackbox完成了同样的事情。您可能能够找到旧的免费版本,但它不支持Unicode,因此如果您正在使用新版Delphi,则需要进行一些转换。过去我也做过这个,所以并不太难。否则,如您所述,对其进行签名以检测篡改,并使用程序唯一知道的对称密钥进行加密以混淆它。如果他们破解了您的代码,那么任何东西都是公平竞争。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接