VFP生成随机加密密钥

文章介绍了CryptKeyHelper类,它是用于WindowsAPI加密函数的包装器,支持生成随机密钥、导出和导入密钥。文章还提及了一个VFP社区的投稿活动,鼓励分享VFP与其他语言混合开发的知识和经验。
摘要由CSDN通过智能技术生成

e6f15885730d9fd5b8cc207485b5e7d7.gif

下面的代码示例中定义的 CryptKeyHelper 类是 Windows API 加密函数的包装器。它实现了允许生成随机加密密钥、将密钥导出到指定文件以及从指定文件导入密钥的方法。

#DEFINE CALG_DES 0x00006601  && 56 bits
#DEFINE CALG_3DES 0x00006603  && 168 bits


* 40, 128 bits
#DEFINE CALG_RC2 0x00006602
#DEFINE CALG_RC4 0x00006801


* 384 bits to 16,384 bits in 8-bit increments.
#DEFINE CALG_RSA_KEYX 0x0000a400
#DEFINE CALG_RSA_SIGN 0x00002400


LOCAL obj as CryptKeyHelper
obj = CREATEOBJECT("CryptKeyHelper")


IF NOT obj.GenerateRandomKey(CALG_RC4, 128)
  ? "GenerateRandomKey failed:",;
    TRANSFORM(obj.LastWin32Error, "@0")
  RETURN
ENDIF


LOCAL cKeyFile
cKeyFile = "samplekey.txt"


IF NOT obj.ExportKeyToFile(m.cKeyFile)
  ? "ExportKeyToFile failed:",;
    TRANSFORM(obj.LastWin32Error, "@0")
  RETURN
ENDIF


MODIFY FILE (m.cKeyFile)


IF NOT obj.ImportKeyFromFile(m.cKeyFile)
  ? "ImportKeyFromFilefailed:",;
    TRANSFORM(obj.LastWin32Error, "@0")
ENDIF


? "Key imported from file successfully"
* end of main


DEFINE CLASS CryptKeyHelper as Session
#DEFINE CRYPT_VERIFYCONTEXT 0xf0000000
#DEFINE PROV_RSA_FULL 1
#DEFINE CRYPT_EXPORTABLE 1


#DEFINE NTE_BAD_KEY 0x80090003
#DEFINE NTE_BAD_ALGID 0x80090008
#DEFINE NTE_BAD_FLAGS 0x80090009


#DEFINE PLAINTEXTKEYBLOB 8


PROTECTED hProv, hKey
  hProv = 0
  hKey = 0
  LastWin32Error=0
  
PROCEDURE Init
  THIS.declare
  IF NOT THIS.GetContext()
    RETURN .F.
  ENDIF


PROCEDURE Destroy
  THIS.DestroyKey
  THIS.ReleaseContext


PROCEDURE GenerateRandomKey
LPARAMETERS nAlgId, nKeyBits
  THIS.DestroyKey
  THIS.LastWin32Error = 0


  LOCAL nFlags, hKey
  
  IF EMPTY(m.nKeyBits)
    nKeyBits = 40
  ENDIF
  
  nFlags = BITOR(CRYPT_EXPORTABLE,;
    BITLSHIFT(nKeyBits, 16))


  hKey = 0
  
  IF CryptGenKey(;
    THIS.hProv, m.nAlgId, m.nFlags, @hKey) > 0
    THIS.hKey = m.hKey
    RETURN .T.
  ENDIF


  THIS.LastWin32Error = GetLastError()
RETURN .F.


PROCEDURE ImportKeyFromFile
LPARAMETERS cFilename
  LOCAL cBuffer, hKey
  
  cBuffer = FILETOSTR(m.cFilename)
  hKey = 0
  
  IF CryptImportKey(;
    THIS.hProv, m.cBuffer, LEN(m.cBuffer),;
    0, CRYPT_EXPORTABLE, @hKey) > 0
  
    THIS.DestroyKey
    THIS.hKey = m.hKey
    RETURN .T.
  ENDIF


  THIS.LastWin32Error = GetLastError()
RETURN .F.


PROCEDURE ExportKeyToFile
LPARAMETERS cFilename
  IF THIS.hKey = 0
    RETURN .F.
  ENDIF
  
  LOCAL nBlobLength, cBuffer
  nBlobLength = 0


  = CryptExportKey(;
    THIS.hKey, 0, PLAINTEXTKEYBLOB,;
    0, 0, @nBlobLength)
    
  IF nBlobLength = 0
    THIS.LastWin32Error = GetLastError()
    RETURN .F.
  ENDIF
    
  cBuffer = REPLICATE(CHR(0), m.nBlobLength)


  IF CryptExportKey(;
    THIS.hKey, 0, PLAINTEXTKEYBLOB, 0,;
    @cBuffer, @nBlobLength) > 0


    STRTOFILE(m.cBuffer, m.cFilename)
    RETURN .T.
  ENDIF
  
  THIS.LastWin32Error = GetLastError()
RETURN .F.


PROTECTED PROCEDURE ReleaseContext
  = CryptReleaseContext(THIS.hProv, 0)
  THIS.hProv = 0


PROTECTED PROCEDURE DestroyKey
  IF THIS.hKey <> 0
    = CryptDestroyKey(THIS.hKey)
    THIS.hKey= 0
  ENDIF


PROTECTED PROCEDURE GetContext
* get handle to the crypto provider
  LOCAL hProv
  hProv = 0
  IF CryptAcquireContext(@hProv, NULL, NULL,;
    PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) = 0
    RETURN .F.
  ENDIF
  THIS.hProv = m.hProv
RETURN .T.


PROTECTED PROCEDURE declare
  DECLARE INTEGER GetLastError IN kernel32


  DECLARE INTEGER CryptAcquireContext IN advapi32;
    INTEGER @hProvHandle, STRING cContainer, ;
    STRING cProvider, INTEGER nProvType, INTEGER nFlags


  DECLARE INTEGER CryptReleaseContext IN advapi32;
    INTEGER hProvHandle, INTEGER nReserved


  DECLARE INTEGER CryptGenKey IN advapi32;
    INTEGER hProv, INTEGER Algid,;
    INTEGER dwFlags, INTEGER @phKey


  DECLARE INTEGER CryptExportKey IN advapi32;
    INTEGER hKey, INTEGER hExpKey,;
    INTEGER dwBlobType, INTEGER dwFlags,;
    STRING @pbData, INTEGER @pdwDataLen


  DECLARE INTEGER CryptImportKey IN advapi32;
    INTEGER hProv, STRING @pbData,;
    INTEGER dwDataLen, INTEGER hPubKey,;
    INTEGER dwFlags, INTEGER @phKey


  DECLARE INTEGER CryptDestroyKey IN advapi32;
    INTEGER hKey


ENDDEFINE

猫猫的心里话

加菲猫的VFP|狐友会社群接收投稿啦

加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。

商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。

暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。

加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"

我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

2023年狐友会社群会员继续招募中

社群会员获取的权益有:

祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。

开放的录播课程有:

微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发。

源码类资源有:

支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。

会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务

d94862e19b6fc7bfea3ffee97621455f.gif

5a3b17c9b4ac2b1415b209a3ab99c3ab.jpeg

35d1417d2e1f747c68c1dc1120ad3bb9.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值