加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:18:04 所属栏目:大数据 来源:网络整理
导读:美好的一天. 我需要教Windows CryptoAPI使用密钥的私有(非公共)部分加密消息,并使用public解密.这对于向用户提供他们可以阅读但无法更改的信息是必要的. 它现在如何运作: 我得到了背景 CryptAcquireContext(@Prov,PAnsiChar(containerName),nil,PROV_RSA_FU
美好的一天.

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

它现在如何运作:

我得到了背景

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

生成密钥对

CryptGenKey(Prov,CALG_RSA_KEYX,CRYPT_EXPORTABLE,@key)

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

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

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

CryptDecrypt(key,@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并购买它,如果它适合您.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读