当前位置 : 主页 > 编程语言 > delphi >

delphi – WinAPI – > CryptoAPI – > RSA,私有加密,公共解密

来源:互联网 收集:自由互联 发布时间:2021-06-23
美好的一天. 我需要教Windows CryptoAPI使用密钥的私有(非公共)部分加密消息,并使用public解密.这对于向用户提供他们可以阅读但无法更改的信息是必要的. 它现在如何运作: 我得到了背景
美好的一天.

我需要教Windows CryptoAPI使用密钥的私有(非公共)部分加密消息,并使用public解密.这对于向用户提供他们可以阅读但无法更改的信息是必要的.

它现在如何运作:

我得到了背景

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

生成密钥对

CryptGenKey(Prov, CALG_RSA_KEYX, CRYPT_EXPORTABLE, @key)

加密(问题在这里.“密钥” – 密钥对,函数使用其公共部分);

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

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

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

感谢您的关注/帮助.

更新

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

问题是我需要加密一个数据库字段,并确保除了我之外没有人可以更改它.只有在我的程序的帮助下才能读取该字段(直到某人反编译并获得公钥).这可以通过对称的密钥和数字签名来完成,但是我需要创建另一个字段并存储另一个密钥等等……

我希望我们能以某种方式教会WIN API按我的意愿去做.我知道我可以用RSA这样做,我希望不知何故WinAPI支持这个功能.

不支持使用私钥加密数据并使用公钥对其进行解密,因为具有“已发布”公钥的任何人都可以对其进行解密.加密它的价值是什么?

如果要验证数据是否未更改,则需要对数据进行签名.签名使用私钥加密数据的散列.看看签名功能.

您可以欺骗签名功能来执行您想要的操作.我已经完成了其他实现,但我还没有尝试使用Microsoft CryptoAPI.

另请注意,使用RSA加密时,纯文本邮件不能长于密钥.因此,如果您使用的是2048位密钥,则只能加密最多256个字节的消息体(减少一些用于开销).

考虑使用非对称加密仅传递对称密钥,并使用对称密钥加密和解密任何大小的数据.

更新

您可以使用CryptSignHash()功能.通常,这用于“签名”哈希,但您可以将所需的任何数据放入哈希:

Set the hash value in the hash object by using the HP_HASHVAL value of
the dwParam parameter in CryptSetHashParam.

如果输入应该是SHA1哈希值,则可能限制为这么多字节.

或者,您可能希望考虑使用OpenSSL.如果我没记错的话,使用其RSA signing功能加密私钥非常简单.

此外,我使用旧的(免费软件)版本的SecureBlackbox完成了同样的事情.您可能能够找到旧的免费版本,但它不是Unicode友好的,所以如果您使用新的Delphi,您将进行一些转换.我过去也做过这个,所以这并不难.

您也可以考虑尝试使用当前的SecureBlackbox并购买它,如果它适合您.

否则,如您所述,将其签名以检测篡改,并使用只有程序知道的对称密钥对其进行加密,以便对其进行模糊处理.

如果他们破解你的代码,无论如何,任何东西都是公平的游戏.

网友评论