Jump to content

konya

Active Members
  • Posts

    30
  • Joined

  • Last visited

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

konya's Achievements

Seeker

Seeker (1/7)

3

Reputation

  1. I use both Crypt.au3 and CryptoNG.au3 and often operate conversion and creation and non-file usage. I would like to share some codes that I have improved or generated, hoping to be helpful to you. #include "..\CryptoNG.au3" #include <bignum.au3> #include <string.au3> #include <array.au3> Local $c_data = FileOpenDialog("Select a license data", @ScriptDir & "\", "c data (*.*)", 1) If @error Then MsgBox(4096,"","No File(s) choose") Exit EndIf Local $hFileOpen = FileOpen($c_data, 0) Local $c = FileRead($hFileOpen) $Private_c =_WinAPI_Base64Decode($c) $n_binary = Binary("0xput in data") $Public_key = Create_to_Blob(@ScriptDir&"\Test.blob","public", 2048, 65537, $n_binary, 0x0, 0x0, 0, 0 ) $m = _CryptoNG_RSA_EncryptData($Private_c , $Public_key, $CNG_BCRYPT_PAD_NONE, Default, "binary" ) ;Read_to_Blob(@ScriptDir&"\example_legacy_privatekey.blob", "Private", "Legacy") ;Read_to_Blob(@ScriptDir&"\example_legacy_publickey.blob", "Public", "Legacy") ;Read_to_Blob(@ScriptDir&"\example_rsa_privatekey.blob","Private") ;Read_to_Blob(@ScriptDir&"\example_rsa_publickey.blob","public") ;Create_to_Blob(@ScriptDir&"\Test20250227.blob","public",2048,65537,Binary("0x" & _BigHex_Swap_endian("092E57E9A31BB37F89222D15A2449594A4ED5705BF395A4469218881CA8C8A27437F7CE2B1ADEF8D93AE19BF381489DD7D06ED674FF945BF932F3FD81CEDB875F8A677CD4A4468A5DF249B9C0611F5E31DE60DBA86BCB69C38D0EED3931A61E379136E52FB7D39B30B5FA29CA5205D8B6A8101E666779EF3D99B196B4F54AA43F682B53FA5BE8986A7086D4C75975DCB22640DD8ACFAEBA7C8D72058AC997F4EB72F824FD45C55C29C0834AB0D629B56F191A4BB16CDA0694141DC64DAACEF8F923FDC8F3734FA5CE59E7034C2D9237358084259D10134C0A13C2098847630B656179B1F7DB61674D1B705A10E41A7F215D0D865A46E6BC2850642BA413C55C5")),Binary("0x" & _BigHex_Swap_endian("C7C6000BB7C3E10D0440AB2BE592D5F0A7D7899A721A256C0554CF3989D77C1AC1BCC27F9CF4884033A16D0CA8B478A9B2DCB92B6A5993AD3E303D971F1539C8AD306697BA08B340EEAD98D4C462B5E77DF9615F0DA5ED5DFA5B6167AD19D6C6A06AAD1ED71E8E1B7A99F9F3E3838DE7F51F0B2C5AE3D2B784C55A29AAB8A8CF")),Binary("0x" & _BigHex_Swap_endian("AF54BA9A2567F5AD9BC29158786F9E7264DDB487E8750B1E2455121383CE487EA2F1E43842D42864830063FCD906B521F6DE05CACBD8CC5886486DFA51DFB6D404F5168F26B5508F6F71D937C27A0EF90300A60B9293AB00B3D2917C65D2B7AFDC5635F0AC721622307DF3D846F501CA1125D567D4178929CFF93281202345F3")),0,1,"Legacy") ;Create_to_Blob(@ScriptDir&"\Test20250227.blob","PRIVATE",2048,65537,Binary("0x" & _BigHex_Swap_endian("092E57E9A31BB37F89222D15A2449594A4ED5705BF395A4469218881CA8C8A27437F7CE2B1ADEF8D93AE19BF381489DD7D06ED674FF945BF932F3FD81CEDB875F8A677CD4A4468A5DF249B9C0611F5E31DE60DBA86BCB69C38D0EED3931A61E379136E52FB7D39B30B5FA29CA5205D8B6A8101E666779EF3D99B196B4F54AA43F682B53FA5BE8986A7086D4C75975DCB22640DD8ACFAEBA7C8D72058AC997F4EB72F824FD45C55C29C0834AB0D629B56F191A4BB16CDA0694141DC64DAACEF8F923FDC8F3734FA5CE59E7034C2D9237358084259D10134C0A13C2098847630B656179B1F7DB61674D1B705A10E41A7F215D0D865A46E6BC2850642BA413C55C5")),Binary("0x" & _BigHex_Swap_endian("C7C6000BB7C3E10D0440AB2BE592D5F0A7D7899A721A256C0554CF3989D77C1AC1BCC27F9CF4884033A16D0CA8B478A9B2DCB92B6A5993AD3E303D971F1539C8AD306697BA08B340EEAD98D4C462B5E77DF9615F0DA5ED5DFA5B6167AD19D6C6A06AAD1ED71E8E1B7A99F9F3E3838DE7F51F0B2C5AE3D2B784C55A29AAB8A8CF")),Binary("0x" & _BigHex_Swap_endian("AF54BA9A2567F5AD9BC29158786F9E7264DDB487E8750B1E2455121383CE487EA2F1E43842D42864830063FCD906B521F6DE05CACBD8CC5886486DFA51DFB6D404F5168F26B5508F6F71D937C27A0EF90300A60B9293AB00B3D2917C65D2B7AFDC5635F0AC721622307DF3D846F501CA1125D567D4178929CFF93281202345F3")),0,1,"Legacy") Global Const $tagRSAPUBKEY = _ "align 1;" & _ "char magic[4];" & _ "uint bitlen;" & _ "uint PubExpLength;" & _ "uint ModulusLength;" & _ "uint PLength;" & _ "uint QLength;" & _ "byte PubExp[3];" & _ "byte Modulus[1];" Global Const $tagRSAPRIVATEKEY = _ "align 1;" & _ "char magic[4];" & _ "uint bitlen;" & _ "uint PubExpLength;" & _ "uint ModulusLength;" & _ "uint PLength;" & _ "uint QLength;" & _ "byte PubExp[3];" & _ "byte Modulus[1];" & _ "byte P[1];" & _ "byte q[1];" Global Const $tagRSAPRIVATEKEY_Legacy = _ "byte bType[1];" & _ "byte bVersion[1];" & _ "word reserved[1];" & _ "byte aiKeyAlg[4];" & _ "char magic[4];" & _ "uint bitlen;" & _ "byte PubExp[4];" & _ "byte Modulus[1];" & _ "byte p[1];" & _ "byte q[1];" & _ "byte exponent1[1];" & _ "byte exponent2[1];" & _ "byte coefficient[1];" & _ "byte privateExponent[1];" Global Const $tagRSAPUBKEY_Legacy = _ "byte bType[1];" & _ "byte bVersion[1];" & _ "word reserved[1];" & _ "byte aiKeyAlg[4];" & _ "char magic[4];" & _ "uint bitlen;" & _ "byte PubExp[4];" & _ "byte Modulus[1];" Func _BigNum_inverse($a, $b) $result = 0 Local $array[0][2], $cc = 1 While 1 If Mod($cc, 2) = 1 Then _ArrayAdd($array, $b & "|" & $a) Else _ArrayAdd($array, $a & "|" & $b) EndIf $cc += 1 $result = _BigNum_Mod($a, $b) If $result <> 0 Then $a = $b $b = $result Else ExitLoop EndIf WEnd $cc = 1 Local $d = "", $k = "" For $i = UBound($array) - 1 To 0 Step -1 If $cc = 1 Then If $array[$i][0] = 1 Then $d = 1 Else $d = 1 $k = $array[$i][0] - 1 EndIf EndIf If $cc <> 1 Then If $k = "" Then $k = _BigNum_Div((_BigNum_Sub(_BigNum_Mul($array[$i][0], $d), 1)), $array[$i][1]) Else $d = _BigNum_Div((_BigNum_Add(_BigNum_Mul($array[$i][1], $k), 1)), $array[$i][0]) $k = "" EndIf EndIf $cc += 1 Next Return $d EndFunc Func _BigHex_Swap_endian($data) $result = "" if IsBinary($data) Then $data = Hex($data,BinaryLen($data)) EndIf if Mod(StringLen($data),2) <> 0 Then $data = "0" & $data EndIf for $i = 1 to StringLen($data) step 2 $result = StringMid($data,$i,2) & $result Next Return $result EndFunc Func _BigNum_ToBase2($iDec, $base = 16 , $checkfirstzero = 0) $base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ;base64 ;Sexagesimal $base60_2 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx" ;sexagesimal $base32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" ;base32 $base24 = "0123456789ABCDEFGHJKLMNP" ;base24 $base16 = "0123456789ABCDEF" ;hex ;Duodecimal system or dozenal $base12 = "0123456789AB" ;duodecimal $base10 = "0123456789" ;base10 $base8 = "01234567" ;oct $base2 = "01" ;binary If $base = 2 Then $Symbol = $base2 ElseIf $base = 8 Then $Symbol = $base8 ElseIf $base = 10 Then $Symbol = $base10 ElseIf $base = 16 Then $Symbol = $base16 ElseIf $base = 60 Then $Symbol = $base60_2 ElseIf $base = 64 Then $Symbol = $base64 EndIf Local $Out, $ost $Symbol = StringSplit($Symbol, '') If @error Or $Symbol[0] < 2 Then Return SetError(1, 0, $iDec) Do $ost = _BigNum_Mod($iDec, $Symbol[0]) $iDec = _BigNum_Div(_BigNum_Sub($iDec, $ost), $Symbol[0]) $Out = $Symbol[$ost + 1] & $Out Until Not Number($iDec) if $checkfirstzero = 1 Then if Mod(StringLen($Out),2) <> 0 Then $Out = "0" & $Out EndIf EndIf Return SetError(0, $Symbol[0], $Out) EndFunc Func _BigHex_ToBase2($sDecimal, $iBase) Local $vDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!""#$%&'()*+,-./:;<=>?@[\]^_`{|}~" ; 96 ASCII symbols, use Unicode for more 94個字元 If $iBase > StringLen($vDigits) Then SetError(1, 0, 0) $vDigits = StringSplit($vDigits, '', 2) Local $sResult = 0 For $i = 1 To StringLen($sDecimal) $nn = _ArraySearch($vDigits, StringMid($sDecimal, $i, 1)) $sResult = _BigNum_Add(_BigNum_Mul($iBase, $sResult), $nn) Next Return $sResult EndFunc Func Read_to_Blob($key_path ,$tag = "Public", $tag2 = "new" , $type = "File" , $showdata = 1) Local $returndata[2] if $type <> "File" Then $blob_b = $key_path Else Local $hFile = FileOpen($key_path,$FO_BINARY) Local $blob_b = FileRead($hFile) FileClose($hFile) EndIf Local $blob_handle = DllStructCreate("byte a["&BinaryLen($blob_b)&"];") $blob_handle.a = $blob_b if $tag2 = "new" Then if $tag = "Public" Then Local $blob_data = DllStructCreate($tagRSAPUBKEY,DllStructGetPtr($blob_handle)) Local $tagRSAPUBKEY2 = StringReplace($tagRSAPUBKEY,"Modulus[1]","Modulus["&$blob_data.bitlen/8&"]") $blob_data = DllStructCreate($tagRSAPUBKEY2,DllStructGetPtr($blob_handle)) $returndata[1] = $tagRSAPUBKEY2 if $showdata = 1 Then _WinAPI_DisplayStruct($blob_data,$tagRSAPUBKEY2) EndIf Else Local $blob_data = DllStructCreate($tagRSAPRIVATEKEY,DllStructGetPtr($blob_handle)) Local $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY,"Modulus[1]","Modulus["&$blob_data.bitlen/8&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"p[1]","p["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"q[1]","q["&$blob_data.bitlen/8/2&"]") $blob_data = DllStructCreate($tagRSAPRIVATEKEY2,DllStructGetPtr($blob_handle)) $returndata[1] = $tagRSAPRIVATEKEY2 if $showdata = 1 Then _WinAPI_DisplayStruct($blob_data,$tagRSAPRIVATEKEY2) EndIf EndIf Else if $tag = "Public" Then Local $blob_data = DllStructCreate($tagRSAPUBKEY_Legacy,DllStructGetPtr($blob_handle)) Local $tagRSAPUBKEY2_Legacy = StringReplace($tagRSAPUBKEY_Legacy,"Modulus[1]","Modulus["&$blob_data.bitlen/8&"]") $blob_data = DllStructCreate($tagRSAPUBKEY2_Legacy,DllStructGetPtr($blob_handle)) $returndata[1] = $tagRSAPUBKEY2_Legacy if $showdata = 1 Then _WinAPI_DisplayStruct($blob_data,$tagRSAPUBKEY2_Legacy) EndIf Else Local $blob_data = DllStructCreate($tagRSAPRIVATEKEY_Legacy,DllStructGetPtr($blob_handle)) Local $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY_Legacy,"Modulus[1]","Modulus["&$blob_data.bitlen/8&"]") $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY2_Legacy,"p[1]","p["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY2_Legacy,"q[1]","q["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY2_Legacy,"exponent1[1]","exponent1["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY2_Legacy,"exponent2[1]","exponent2["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY2_Legacy,"coefficient[1]","coefficient["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2_Legacy = StringReplace($tagRSAPRIVATEKEY2_Legacy,"privateExponent[1]","privateExponent["&$blob_data.bitlen/8&"]") $blob_data = DllStructCreate($tagRSAPRIVATEKEY2_Legacy,DllStructGetPtr($blob_handle)) $returndata[1] = $tagRSAPRIVATEKEY2_Legacy if $showdata = 1 Then _WinAPI_DisplayStruct($blob_data,$tagRSAPRIVATEKEY2_Legacy) EndIf EndIf EndIf $returndata[0] = $blob_data Return $returndata EndFunc Func Create_to_Blob($key_path,$tag = "Public" , $bitlen = 2048, $e = 65537, $Modulus = Binary("0x00"), $p = Binary("0x00"), $q = Binary("0x00") ,$write_or_binary = 1, $show = 0, $tag2 = "new") if $tag2 = "new" Then if $tag = "Public" Then Local $tagRSAPUBKEY2 = StringReplace($tagRSAPUBKEY,"Modulus[1]","Modulus["&$bitlen/8&"]") Local $blob_data = DllStructCreate($tagRSAPUBKEY2) $blob_data.magic = "RSA1" $blob_data.bitlen = $bitlen $blob_data.PubExpLength = 3 $blob_data.ModulusLength = $blob_data.bitlen/8 $blob_data.PLength = 0 $blob_data.QLength = 0 $blob_data.PubExp = $e $blob_data.Modulus = $Modulus if $show = 1 Then _WinAPI_DisplayStruct($blob_data,$tagRSAPUBKEY2) EndIf Else Local $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY,"Modulus[1]","Modulus["&$bitlen/8&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"p[1]","p["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"q[1]","q["&$bitlen/8/2&"]") Local $blob_data = DllStructCreate($tagRSAPRIVATEKEY2) $blob_data.magic = "RSA2" $blob_data.bitlen = $bitlen $blob_data.PubExpLength = 3 $blob_data.ModulusLength = $blob_data.bitlen/8 $blob_data.PLength = $blob_data.bitlen/8/2 $blob_data.QLength = $blob_data.bitlen/8/2 $blob_data.PubExp = $e $blob_data.Modulus = $Modulus $blob_data.p = $p $blob_data.q = $q if $show = 1 then _WinAPI_DisplayStruct($blob_data,$tagRSAPRIVATEKEY2) EndIf EndIf Else if $tag = "Public" Then Local $tagRSAPUBKEY_Legacy2 = StringReplace($tagRSAPUBKEY_Legacy,"Modulus[1]","Modulus["&$bitlen/8&"]") Local $blob_data = DllStructCreate($tagRSAPUBKEY_Legacy2) $blob_data.bType = 0x06 $blob_data.bVersion = 0x02 $blob_data.aiKeyAlg = Binary("0x00A40000") $blob_data.magic = "RSA1" $blob_data.bitlen = $bitlen $blob_data.PubExp = Binary("0x" & _BigHex_Swap_endian(_BigNum_ToBase2($e,16,1))) $blob_data.Modulus = Binary("0x" & _BigHex_Swap_endian($Modulus)) if $show = 1 Then _WinAPI_DisplayStruct($blob_data,$tagRSAPUBKEY_Legacy2) EndIf Else Local $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy,"Modulus[1]","Modulus["&$bitlen/8&"]") $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy2,"p[1]","p["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy2,"q[1]","q["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy2,"exponent1[1]","exponent1["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy2,"exponent2[1]","exponent2["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy2,"coefficient[1]","coefficient["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY_Legacy2 = StringReplace($tagRSAPRIVATEKEY_Legacy2,"privateExponent[1]","privateExponent["&$bitlen/8&"]") Local $blob_data = DllStructCreate($tagRSAPRIVATEKEY_Legacy2) $blob_data.bType = 0x07 $blob_data.bVersion = 0x02 $blob_data.aiKeyAlg = Binary("0x00A40000") $blob_data.magic = "RSA2" $blob_data.bitlen = $bitlen $blob_data.PubExp = Binary("0x" & _BigHex_Swap_endian(_BigNum_ToBase2($e,16,1))) $blob_data.Modulus = Binary("0x" & _BigHex_Swap_endian($Modulus)) $blob_data.p = Binary("0x" & _BigHex_Swap_endian($p)) $blob_data.q = Binary("0x" & _BigHex_Swap_endian($q)) Local $D = _BigNum_inverse(_BigNum_Mul(_BigNum_Sub(_BigHex_ToBase2(Hex($p), 16),1),_BigNum_Sub(_BigHex_ToBase2(Hex($q), 16),1)),$e) $blob_data.exponent1 = Binary("0x" &_BigHex_Swap_endian(_BigNum_ToBase2(_BigNum_mod($D,_BigNum_Sub(_BigHex_ToBase2(Hex($p), 16),1)),16,1))) $blob_data.exponent2 = Binary("0x" &_BigHex_Swap_endian(_BigNum_ToBase2(_BigNum_mod($D,_BigNum_Sub(_BigHex_ToBase2(Hex($q), 16),1)),16,1))) $blob_data.coefficient = Binary("0x" &_BigHex_Swap_endian(_BigNum_ToBase2(_BigNum_inverse(_BigHex_ToBase2(Hex($p), 16) , _BigHex_ToBase2(Hex($q), 16)),16,1))) $blob_data.privateExponent = Binary("0x" &_BigHex_Swap_endian(_BigNum_ToBase2($D,16,1))) if $show = 1 then _WinAPI_DisplayStruct($blob_data,$tagRSAPRIVATEKEY_Legacy2) EndIf EndIf EndIf Local $blob_binary = DllStructCreate("byte a["&DllStructGetSize($blob_data)&"];",DllStructGetPtr($blob_data)) if $write_or_binary = 1 Then $hFile = FileOpen($key_path,$FO_BINARY+$FO_OVERWRITE) FileWrite($hFile,$blob_binary.a) FileClose($hFile) Else Return $blob_binary.a EndIf EndFunc Func __CryptoNG_BcryptImportKeyPair($hAlgorithmProvider, $sKeyBlobFile, $sKeyBlobType, $Key_type = "file" ) If $__gbDebugging Then _DebugOut(@CRLF & "Function: __CryptoNG_BcryptImportKeyPair()") Local $aResult[0] Local $iError = 0, _ $iStatusCode = 0 Local $tBuffer = "" Local $hFile = -1, _ $hKey = -1 Local $xKeyBlob = Binary("") ;Make sure file exists if $Key_type = "file" Then If Not FileExists($sKeyBlobFile) Then Return SetError(3, 0, "") ;Read binary blob file $hFile = FileOpen($sKeyBlobFile, $FO_BINARY) If $hFile = -1 Then Return SetError(4, 0, "") $xKeyBlob = FileRead($hFile) FileClose($hFile) Else $xKeyBlob = $sKeyBlobFile EndIf ;Create a binary buffer, containing key blob, to pass to function $tBuffer = DllStructCreate(StringFormat("byte data[%i]", BinaryLen($xKeyBlob))) $tBuffer.data = $xKeyBlob If $__gbDebugging Then _DebugReportVar("Public/Private Key Blob", $tBuffer.data) ;Import key pair $aResult = DllCall(__CryptoNG_GetBcryptDllHandle(), "int", "BCryptImportKeyPair", _ "handle", $hAlgorithmProvider, _ "handle", Null, _ "wstr", $sKeyBlobType, _ "handle*", Null, _ "struct*", $tBuffer, _ "ulong", DllStructGetSize($tBuffer), _ "ulong", $CNG_BCRYPT_NO_KEY_VALIDATION _ ) If @error Then $iError = @error $__gsLastErrorMessage = __CryptoNG_DllCallErrorMessage($iError) Return SetError(1, $iError, "") EndIf If $__gbDebugging Then _DebugReportVar("BCryptImportKeyPair $aResult", $aResult) ;Get returned values from dllcall $iStatusCode = $aResult[0] $hKey = $aResult[4] ;Check status code from dllcall If $iStatusCode <> $CNG_STATUS_SUCCESS Then $__gsLastErrorMessage = __CryptoNG_StatusMessage($iStatusCode) Return SetError(2, $iStatusCode, "") EndIf ;All is good, return handle pointer Return $hKey EndFunc Func _CryptoNG_RSA_EncryptData($sText, $sPublicKeyBlobFile, $iPadding = Default, $sProvider = Default ,$Key_type = "file") If $__gbDebugging Then _DebugOut(@CRLF & "Function: _CryptoNG_RSA_EncryptData()") Local $hAlgorithmProvider = -1, _ $hEncryptionKey = -1 Local $xEncryptedText = "" ;Resolve defaults If $sProvider = Default Then $sProvider = "Microsoft Primitive Provider" If $iPadding = Default Then $iPadding = $CNG_BCRYPT_PAD_PKCS1 ;Make sure that text is not blank If $sText = "" Then $__gsLastErrorMessage = "Invalid parameter - Text cannot be blank." Return SetError(-1, 0, "") EndIf ;Make sure that key blob file exists if $Key_type = "file" Then If Not FileExists($sPublicKeyBlobFile) Then $__gsLastErrorMessage = "Public key blob file does not exist." Return SetError(-2, 0, "") EndIf EndIf ;Open algorithm provider $hAlgorithmProvider = __CryptoNG_BCryptOpenEncryptionAlgorithmProvider($CNG_BCRYPT_RSA_ALGORITHM, $sProvider) If @error Then Return SetError(2, 0, "") ;Import rsa public key $hEncryptionKey = __CryptoNG_BcryptImportKeyPair($hAlgorithmProvider, $sPublicKeyBlobFile, $CNG_BCRYPT_RSAPUBLIC_BLOB, $Key_type) If @error Then If $hAlgorithmProvider <> -1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) Return SetError(3, 0, "") EndIf ;Encrypt data $xEncryptedText = __CryptoNG_BCryptEncrypt_RSA($CNG_BCRYPT_RSA_ALGORITHM, $sText, $hEncryptionKey, $iPadding) If @error Then If $hAlgorithmProvider <> -1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) If $hEncryptionKey <> -1 Then __CryptoNG_BcryptDestroyKey($hEncryptionKey) Return SetError(4, 0, "") EndIf ;Clean up If $hAlgorithmProvider <> -1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) If $hEncryptionKey <> -1 Then __CryptoNG_BcryptDestroyKey($hEncryptionKey) Return $xEncryptedText EndFunc
  2. GMP Lib very fast more BigNum UDF. Modify _GMPz_get_Str have memory leak bug as below. Func _GMPz_get_Str($pVal1, $iBase = 10) Local $aRet = DllCall($hDLL_GMP, "none:cdecl", "__gmpz_get_str", "str", "", "int", $iBase, "ptr", $pVal1) Return $aRet[1] EndFunc
  3. Share fast power module usage table value. 1._BigNum_Calculate_Last_E($n, $e, $k) get last e value. 2._BigNum_PowerMod_Specified_ciphertext($c, $Last_c, $mod) Func _BigNum_Calculate_Last_E($c, $e, $mod) if $mod = 1 then Return 0 $e = _BigNum_Mod($e,_BigNum_Sub($mod,"1")) $c = _BigNum_Mod($c, $mod) While $e > "0" While _BigNum_Mod($e, 2) = "0" $c = _BigNum_Mod(_BigNum_Mul($c, $c), $mod) $e = _BigNum_Div($e, "2", 0) WEnd $e = _BigNum_Sub($e, "1") WEnd Return $c EndFunc Func _BigNum_PowerMod_Specified_ciphertext($c, $Last_c, $mod) $res = _BigNum_Mod($c, $mod) $res = _BigNum_Mod(_BigNum_Mul($res, $Last_c), $mod) ConsoleWrite("Result = " & $res & @CRLF ) Return $res EndFunc
  4. #include "bignum.au3" #include <Array.au3> #include <String.au3> Global Const $ANS1_Tags[35][2] = [ _ ["01","BOOLEAN"], _ ["02","INTEGER"], _ ["03","BIT STRING"], _ ["04","OCTET STRING"], _ ["05","NULL"], _ ["06","OBJECT IDENTIFIER"], _ ["07","ObjectDescriptor"], _ ["08","EXTERNAL"], _ ["09","REAL"], _ ["0A","ENUMERATED"], _ ["0B","EMBEDDED PDV"], _ ["0C","UTF8String"], _ ["0D","RELATIVE-OID"], _ ["0E","TIME"], _ ["0F","unknow"], _ ["10","SEQUENCE"], _ ["11","SET"], _ ["12","NumericString"], _ ["13","PrintableString"], _ ["14","TeletexString, T61String"], _ ["15","VideotexString"], _ ["16","IA5String"], _ ["17","UTCTime"], _ ["18","GeneralizedTime"], _ ["19","GraphicString"], _ ["1A","VisibleString"], _ ["1B","GeneralString"], _ ["1C","UniversalString"], _ ["1D","CHARACTER STRING"], _ ["1E","BMPString"], _ ["A0","[0]"], _ ["A2","[2]"], _ ["A5","[5]"], _ ["40","Application"], _ ["30","SEQUENCE"]] ;_ArrayDisplay($ANS1_Tags) Local $exponent1, $exponent2, $coefficient, $prime1, $prime2, $privateExponent, $publicExponent, $modulus Local $sFilePath = FileOpenDialog("Please select Key file", "", "Key File(*.*)", 1) If @error Then Exit Local $hFileOpen = FileOpen($sFilePath, 0) Local $sFileRead = FileRead($hFileOpen) if StringInStr($sFileRead,"-----BEGIN PRIVATE KEY-----") <> 0 Then $PEM = Hex(_WinAPI_Base64Decode(_StringBetween($sFileRead,"-----BEGIN PRIVATE KEY-----","-----END PRIVATE KEY-----")[0])) $arrayin = ASN1_Parse($PEM) Private_MAP($arrayin) ElseIf StringInStr($sFileRead,"-----BEGIN RSA PRIVATE KEY-----") <> 0 Then $PEM = Hex(_WinAPI_Base64Decode(_StringBetween($sFileRead,"-----BEGIN RSA PRIVATE KEY-----","-----END RSA PRIVATE KEY-----")[0])) $arrayin = ASN1_Parse($PEM) Private_MAP($arrayin) ElseIf StringInStr($sFileRead,"-----BEGIN PUBLIC KEY-----") <> 0 Then $PEM = Hex(_WinAPI_Base64Decode(_StringBetween($sFileRead,"-----BEGIN PUBLIC KEY-----","-----END PUBLIC KEY-----")[0])) $arrayin = ASN1_Parse($PEM) Puplic_MAP($arrayin) ElseIf StringInStr($sFileRead,"-----BEGIN PUBLIC KEY-----") <> 0 Then $PEM = Hex(_WinAPI_Base64Decode(_StringBetween($sFileRead,"-----BEGIN RSA PUBLIC KEY-----","-----END RSA PUBLIC KEY-----")[0])) $arrayin = ASN1_Parse($PEM) Puplic_MAP($arrayin) EndIf Func ASN1_Parse($data) Local $dataLen, $selectstring, $selectstring_tag, $selectstring_len, $selectstring_len_Dec, $selectstring_data_start, $selectstring_data, $tag_offset, $hr, $result[0][8], $class = 0, $Data_offset = 0 Local $FC = 0, $temp_i, $temp_offset, $CD, $temp_data, $zero_add, $temp_original_len, $temp_original_data $dataLen = StringLen($data) $temp_original_data = $data $temp_original_len = $dataLen ;MsgBox(0,"",$dataLen) _ArrayAdd($result,"Class|ANS.1 TAG|Len TAG|Len Hex|Data String|TAG's Len|Len Dec|Data offset") While $dataLen <> 0 for $i = 1 to $dataLen Step 2 $selectstring = StringMid($data,$i,2) if $selectstring = "" Then ExitLoop EndIf if $selectstring = "00" Then $zero_add += 1 EndIf $hr = _ArraySearch($ANS1_Tags, $selectstring) if $selectstring = "30" or $selectstring = "04" or $selectstring = "03" or $selectstring = "A0" or $selectstring = "A5" or $selectstring = "A2" Then $FC = 1 Else $FC = 0 EndIf ;msgbox(0,$FC,$selectstring) if $hr <> -1 Then $selectstring_tag = StringMid($data,$i+2,2) if $selectstring_tag = "82" Then $selectstring_len = StringMid($data,$i+4,4) $selectstring_len_Dec = Dec(Hex(Binary("0x"&$selectstring_len))) $tag_offset = 8 $selectstring_data_start = $i + 8 ElseIf $selectstring_tag = "81" Then $selectstring_len = StringMid($data,$i+4,2) $selectstring_len_Dec = Dec(Hex(Binary("0x"&$selectstring_len))) $tag_offset = 6 $selectstring_data_start = $i + 6 Else $selectstring_len = $selectstring_tag $selectstring_len_Dec = Dec(Hex(Binary("0x"&$selectstring_len))) $tag_offset = 4 $selectstring_data_start = $i + 4 EndIf if UBound($result) >= 2 Then if $class <> $result[UBound($result)-1][0] Then $Data_offset-=$result[UBound($result)-1][6] EndIf EndIf $Data_offset+=$zero_add $selectstring_data = StringMid($data,$selectstring_data_start,$selectstring_len_Dec*2) _ArrayAdd($result,$class&"|"&$selectstring&"|"&$selectstring_tag&"|"&$selectstring_len&"|"&$selectstring_data&"|"&$tag_offset/2&"|"&$selectstring_len_Dec&"|"&$Data_offset) $zero_add = 0 ;if $FC = 1 Then if $FC = 1 and $class <> 0 Then $CD = $selectstring_len_Dec $temp_data = $data $class+=1 $data = $selectstring_data $dataLen = StringLen($data) $i+=$tag_offset+$selectstring_len_Dec*2 - 2 $temp_i = $i $Data_offset+=$tag_offset/2 + $selectstring_len_Dec $temp_Data_offset = $Data_offset $i = 1 - 2 ContinueLoop EndIf if $CD <> 0 Then $CD = $CD - $selectstring_len_Dec - ($tag_offset/2) if $CD = 0 Then $i = $temp_i $Data_offset = $temp_Data_offset $data = $temp_data $dataLen = StringLen($data) $class-=1 ContinueLoop EndIf EndIf $Data_offset+=$tag_offset/2 + $selectstring_len_Dec $i+=$tag_offset+$selectstring_len_Dec*2 - 2 ;_ArrayDisplay($result) EndIf Next $class+=1 $data = $selectstring_data $dataLen = StringLen($data) if $FC = 0 Then ;MsgBox(0,"",$Data_offset) if $Data_offset*2 >= $temp_original_len Then ExitLoop Else $data = StringMid( $temp_original_data ,2*($i)+1,$temp_original_len-2*($i)) $dataLen = StringLen($data) $class-=2 EndIf EndIf WEnd _ArrayDisplay($result) Return $result EndFunc Func Puplic_MAP($data) Local $CC = 0 For $i = UBound($data) - 1 to 0 step -1 if $data[$i][1] = "02" Then $CC+=1 if $CC = 2 Then $modulus = $data[$i][4] MsgBox(0,"modulus - n (HEX)",$modulus) MsgBox(0,"modulus - n (DEC)",_BigHex_ToBase2($modulus,16)) elseif $CC = 1 Then $publicExponent = $data[$i][4] MsgBox(0,"publicExponent - e",Dec(Hex("0x"&$publicExponent))) EndIf EndIf Next EndFunc Func Private_MAP($data) Local $CC = 0 For $i = UBound($data) - 1 to 0 step -1 if $data[$i][1] = "02" Then $CC+=1 if $CC = 8 Then $modulus = $data[$i][4] MsgBox(0,"modulus - n (HEX)",$modulus) MsgBox(0,"modulus - n (DEC)",_BigHex_ToBase2($modulus,16)) elseif $CC = 7 Then $publicExponent = $data[$i][4] MsgBox(0,"publicExponent - e",Dec(Hex("0x"&$publicExponent))) elseif $CC = 6 Then $privateExponent = $data[$i][4] MsgBox(0,"privateExponent - d",$privateExponent) elseif $CC = 5 Then $prime1 = $data[$i][4] MsgBox(0,"prime1 - p (HEX)",$prime1) MsgBox(0,"prime1 - p (DEC)",_BigHex_ToBase2($prime1,16)) elseif $CC = 4 Then $prime2 = $data[$i][4] MsgBox(0,"prime2 - q (HEX)",$prime2) MsgBox(0,"prime2 - q (DEC)",_BigHex_ToBase2($prime2,16)) elseif $CC = 3 Then $exponent1 = $data[$i][4] MsgBox(0,"exponent1 - d mod (p - 1)",$exponent1) elseif $CC = 2 Then $exponent2 = $data[$i][4] MsgBox(0,"exponent2 - d mod (q - 1)",$exponent2) elseif $CC = 1 Then $coefficient = $data[$i][4] MsgBox(0,"coefficient - q–1 mod p",$coefficient) EndIf EndIf Next EndFunc Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc 1.Execute process 2.Select key file 3.Pop the information 1.pem 2.pem
  5. Very like this UDF. Share some math function. Func _BigNum_EXP($a) $Euler_number = "2.71828182845904523536028747135266249" Return _BigNum_FastPow($Euler_number, $a) EndFunc Func _BigNum_FastPow($a, $b) $check = StringSplit($b,".") if $check[0] = "1" Then Local $ans = 1 While $b > "0" If _BigNum_Mod($b, 2) = "1" Then $ans = _BigNum_Mul($ans, $a) $b = _BigNum_Sub($b, "1") Else $a = _BigNum_Mul($a, $a) $b = _BigNum_Div($b, "2", 0) EndIf WEnd Return StringLeft($ans,32) Else $Denominator = "1"&_StringRepeat("0", StringLen($check[2])) $Numerator = _BigNum_add($check[2] ,_BigNum_mul(String($check[1]),$Denominator)) While 1 $GCD = _BigNum_GCD($Denominator, $Numerator) if $GCD <> 1 Then $Denominator/= $GCD $Numerator/= $GCD Else ExitLoop EndIf WEnd $a = _BigNum_n_Root($a,$Denominator,"35") $b = $Numerator Local $ans = 1 While $b > "0" If _BigNum_Mod($b, 2) = "1" Then $ans = _BigNum_Mul($ans, $a) $b = _BigNum_Sub($b, "1") Else $a = _BigNum_Mul($a, $a) $b = _BigNum_Div($b, "2", 0) EndIf WEnd Return $ans EndIf EndFunc Func _BigNum_LCM($a, $b) Local $result = 0, $c = $a , $d = $b While 1 $result = _BigNum_Mod($a, $b) If $result <> 0 Then $a = $b $b = $result Else ExitLoop EndIf WEnd Return _BigNum_Mul(_BigNum_Div($c, $b), $d) EndFunc Func _BigNum_GCD($a, $b) $result = 0 Local $array[0][2], $cc = 1 While 1 $result = _BigNum_Mod($a, $b) If $result <> 0 Then $a = $b $b = $result Else ExitLoop EndIf WEnd Return $b EndFunc Func _BigNum_PowerMod($n, $e, $k) Local $res = "1" While $e > "0" While _BigNum_Mod($e, 2) = "0" $n = _BigNum_Mod(_BigNum_Mul($n, $n), $k) $e = _BigNum_Div($e, "2", 0) WEnd $res = _BigNum_Mod(_BigNum_Mul($res, $n), $k) $e = _BigNum_Sub($e, "1") WEnd Return $res EndFunc Func _BigHex_ToBase_Fast($sDecimal, $iBase) Local $vDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!""#$%&'()*+,-./:;<=>?@[\]^_`{|}~" If $iBase > StringLen($vDigits) Then SetError(1, 0, 0) $vDigits = StringSplit($vDigits, '', 2) Local $sResult = 0 For $i = 1 To StringLen($sDecimal) $nn = _ArraySearch($vDigits, StringMid($sDecimal, $i, 1)) $sResult = _BigNum_Add(_BigNum_Mul($iBase, $sResult), $nn) Next Return $sResult EndFunc Func _BigNum_inverse($a, $b) $result = 0 Local $array[0][2], $cc = 1 While 1 If Mod($cc, 2) = 1 Then _ArrayAdd($array, $b & "|" & $a) Else _ArrayAdd($array, $a & "|" & $b) EndIf $cc += 1 $result = _BigNum_Mod($a, $b) If $result <> 0 Then $a = $b $b = $result Else ExitLoop EndIf WEnd $cc = 1 Local $d = "", $k = "" For $i = UBound($array) - 1 To 0 Step -1 If $cc = 1 Then If $array[$i][0] = 1 Then $d = 1 Else $d = 1 $k = $array[$i][0] - 1 EndIf EndIf If $cc <> 1 Then If $k = "" Then $k = _BigNum_Div((_BigNum_Sub(_BigNum_Mul($array[$i][0], $d), 1)), $array[$i][1]) Else $d = _BigNum_Div((_BigNum_Add(_BigNum_Mul($array[$i][1], $k), 1)), $array[$i][0]) $k = "" EndIf EndIf $cc += 1 Next Return $d EndFunc
  6. Wish can use GDI+ bitmap to OCR. Found OcrLiteCApi.cpp support bitmap but I'm not have VS build dll. Global Const $tagOCR_POINT = _ "double x;" & _ "double y;" Global Const $tagOCR_INPUT = _ "ptr bitmap;" & _ "int type;" & _ "int channels;" & _ "int width;" & _ "int height;" & _ "long dataLength;" Global Const $tagTEXT_BLOCK = _ "ptr boxPoint;" & _ "float boxScore;" & _ "int angleIndex;" & _ "float angleScore;" & _ "double angleTime;" & _ "ptr text;" & _ "float charScores;" & _ "uint64 charScoresLength;" & _ "uint64 boxPointLength;" & _ "uint64 textLength;" & _ "double crnnTime;" & _ "double blockTime;" Global Const $tagOCR_RESULT = _ "double dbNetTime;" & _ "ptr textBlocks;" & _ "uint64 textBlocksLength;" & _ "double detectTime;"
  7. @TheXman It is can use private key encrypt and public key decrypt no issue. Only share information and help any one.
  8. @TheXman I use your example blob key make a sample,you can check. $hex_c = Binary("0x598218CBE9826AAF525FA728DB78DCFE2A81F886FC2C35BD40A29662BCCA5FBB224814C1C97157DB619E19A6980BBC39510663B0289F49E8F7551C02F918D44119E7A41B669A31D4A9AB72AFA9531626D25767FE108822A8444318A3A2046ACD7CCE91B358FBEB9E643EFDD1A4688FED197188579AFD563CD1E184D21F837B685402BF633FF9B371F19EB466F2C8290683C447803E3D1CA0AFB516CC8FF1B333EACCB0D453E33886C0CAD933B9A198BC7A43C20651BA04935D73E1AA0503D6BE5574FB35D5FCCF62D5D68930332F3B8D568CDF1540F03E3A9C863704509AD973E12D05812FE4E425BD745B59DAF531F0E4B1D5D89E569C543FCFBF75BF1A70BA") $m = _CryptoNG_RSA_EncryptData($hex_c , "example_rsa_publickey.blob", $CNG_BCRYPT_PAD_NONE, Default )     If @error Then         MsgBox(0,"",_CryptoNG_LastErrorMessage())     Else         $m = Hex($m)         $search_zero = StringInStr($m,"FF00")         MsgBox(0,"",BinaryToString("0x"&StringMid($m,$search_zero+4,StringLen($m)-$search_zero)))     EndIf
  9. @TheXman When I use the default setting $CNG_BCRYPT_PAD_PKCS1 , public key decryption will return An invalid parameter was passed to a service of function, but when setting $CNG_BCRYPT_PAD_NONE it is decryption success,result the same openssl_public_decrypt function and I don't know why PHP & openssl want support public key decryption private key ciphertext. When I use other UDF like bignum ,verify result as below : $m = "I like autoit" $c = _BigNum_PowerMod($m, $d, $n) ;Private key encrypt $m = _BigNum_PowerMod($c, $e, $n) ;Public key decrypt Result $m = "I like autoit" or $m = "" $c = _BigNum_PowerMod($m, $e, $n) ;Public key encrypt $m = _BigNum_PowerMod($c, $d, $n) ;Private key decrypt Result $m = "I like autoit" It would be great if the _BigNum_PowerMod performance could be improved,it is need 10second provide the result.
  10. Use _CryptoNG_RSA_EncryptData($Private_c , $Public_key, $CNG_BCRYPT_PAD_NONE ) it is can let public key decrypt.
  11. Share my good idea, manual create key to file or return binary data, use key from memory no need to read files. ;tagRSAPUBKEY Global Const $tagRSAPUBKEY = _ "align 1;" & _ "char magic[4];" & _ "uint bitlen;" & _ "uint PubExpLength;" & _ "uint ModulusLength;" & _ "uint PLength;" & _ "uint QLength;" & _ "byte PubExp[3];" & _ "byte Modulus[1];" Global Const $tagRSAPRIVATEKEY = _ "align 1;" & _ "char magic[4];" & _ "uint bitlen;" & _ "uint PubExpLength;" & _ "uint ModulusLength;" & _ "uint PLength;" & _ "uint QLength;" & _ "byte PubExp[3];" & _ "byte Modulus[1];" & _ "byte P[1];" & _ "byte q[1];" ;RSAPUBKEY Func Read_to_Blob($key_path,$tag = "Public") Local $hFile = FileOpen($key_path,$FO_BINARY) Local $blob_b = FileRead($hFile) FileClose($hFile) Local $blob_handle = DllStructCreate("byte a["&BinaryLen($blob_b)&"];") $blob_handle.a = $blob_b if $tag = "Public" Then Local $blob_data = DllStructCreate($tagRSAPUBKEY,DllStructGetPtr($blob_handle)) Local $tagRSAPUBKEY2 = StringReplace($tagRSAPUBKEY,"Modulus[1]","Modulus["&$blob_data.bitlen/8&"]") $blob_data = DllStructCreate($tagRSAPUBKEY2,DllStructGetPtr($blob_handle)) _WinAPI_DisplayStruct($blob_data,$tagRSAPUBKEY2) Else Local $blob_data = DllStructCreate($tagRSAPRIVATEKEY,DllStructGetPtr($blob_handle)) Local $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY,"Modulus[1]","Modulus["&$blob_data.bitlen/8&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"p[1]","p["&$blob_data.bitlen/8/2&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"q[1]","q["&$blob_data.bitlen/8/2&"]") $blob_data = DllStructCreate($tagRSAPRIVATEKEY2,DllStructGetPtr($blob_handle)) _WinAPI_DisplayStruct($blob_data,$tagRSAPRIVATEKEY2) EndIf Return $blob_handle.a EndFunc Func Create_to_Blob($key_path,$tag = "Public" , $bitlen = 2048, $e = 65537, $Modulus = 0x0, $p = 0x0, $q = 0x0 ,$write_or_binary = 1) if $tag = "Public" Then Local $tagRSAPUBKEY2 = StringReplace($tagRSAPUBKEY,"Modulus[1]","Modulus["&$bitlen/8&"]") Local $blob_data = DllStructCreate($tagRSAPUBKEY2) $blob_data.magic = "RSA1" $blob_data.bitlen = $bitlen $blob_data.PubExpLength = 3 $blob_data.ModulusLength = $blob_data.bitlen/8 $blob_data.PLength = 0 $blob_data.QLength = 0 $blob_data.PubExp = $e $blob_data.Modulus = $Modulus _WinAPI_DisplayStruct($blob_data,$tagRSAPUBKEY2) Else Local $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY,"Modulus[1]","Modulus["&$bitlen/8&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"p[1]","p["&$bitlen/8/2&"]") $tagRSAPRIVATEKEY2 = StringReplace($tagRSAPRIVATEKEY2,"q[1]","q["&$bitlen/8/2&"]") Local $blob_data = DllStructCreate($tagRSAPRIVATEKEY2) $blob_data.magic = "RSA2" $blob_data.bitlen = $bitlen $blob_data.PubExpLength = 3 $blob_data.ModulusLength = $blob_data.bitlen/8 $blob_data.PLength = $blob_data.bitlen/8/2 $blob_data.QLength = $blob_data.bitlen/8/2 $blob_data.PubExp = $e $blob_data.Modulus = $Modulus _WinAPI_DisplayStruct($blob_data,$tagRSAPRIVATEKEY2) EndIf Local $blob_binary = DllStructCreate("byte a["&DllStructGetSize($blob_data)&"];",DllStructGetPtr($blob_data)) if $write_or_binary = 1 Then $hFile = FileOpen($key_path,$FO_BINARY+$FO_OVERWRITE) FileWrite($hFile,$blob_binary.a) FileClose($hFile) Else Return $blob_binary.a EndIf EndFunc
  12. I'm have use autoit call the winscard to connect contact and contact less device to use, autoit is perfact . Func Cardapi_getreader($nonui = False) if $mszGroups = "" Then $mszGroups = "SCard$AllReaders" EndIf Dim $aReaderList[0][2] $Readerslenth = 0 ;SCardListReaders ;1獲取Readers list lenth $result = DllCall($WinScard_DLL, "long", "SCardListReaders", "ptr", DllStructGetData($hContext,1) , "str", "", "str", "", "long*", 0) ;_ArrayDisplay($result) $Readerslenth = $result[4] Local $szReadername2 = DllStructCreate("byte a["&$Readerslenth&"];") ;2帶入Readers list lenth 獲取List $result = DllCall($WinScard_DLL, "long", "SCardListReaders", "ptr", DllStructgetdata($hContext,1) , "str", $mszGroups, "ptr", DllStructGetPtr($szReadername2) , "long*", $Readerslenth) ;有in out 才要加* 原本就有out 定義就不用 Local $Meger_reader_name = "" for $i = 1 to $Readerslenth if hex(StringToBinary(StringMid(BinaryToString($szReadername2.a),$i,1))) <> "00" Then $Meger_reader_name &=StringMid(BinaryToString($szReadername2.a),$i,1) ;msgbox(0,"",StringMid(BinaryToString($szReadername2.a),$i,1)) Else _ArrayAdd($aReaderList, $Meger_reader_name) $Meger_reader_name = "" EndIf Next ;_ArrayDisplay($aReaderList) ;msgbox(0,"",UBound($aReaderList)) if UBound($aReaderList) > 2 Then While 1 $iReader = Input_GUI("Reader list",$aReaderList,0,1) if $iReader <> -1 Then ExitLoop EndIf WEnd $szReadername = $aReaderList[$iReader][0] ;msgbox(0,"",$szReadername) Else if $Readerslenth <> 0 Then $szReadername = BinaryToString($szReadername2.a) ;msgbox(0,"",$szReadername) EndIf EndIf ;_ArrayDisplay($result,"getreader") ;ConsoleWrite($result[0]&@CRLF) if $nonui = False Then if $result[0] = -2146435026 Then msgbox(0,"Getreader","沒有可用的智慧卡讀取裝置。") ;Exit elseif $result[0] = -2146435043 Then msgbox(0,"Getreader","智慧卡資源管理員並未執行。") Cardapi_unini() $steprec -= 1 Return True ;Exit elseif $result[0] = -2146435042 Then msgbox(0,"Getreader","智慧卡資源管理員已關閉。") Cardapi_unini() $steprec -= 1 Return True ;Exit EndIf if $result[0] <> 0 Then Return False EndIf Else if $result[0] = -2146435026 Then Return False ;msgbox(0,"getreader","沒有可用的智慧卡讀取裝置。") ;Exit elseif $result[0] = -2146435043 Then Cardapi_unini() $steprec -= 1 Return True ;msgbox(0,"getreader","智慧卡資源管理員並未執行。") ;Exit elseif $result[0] = -2146435042 Then ;msgbox(0,"getreader","智慧卡資源管理員已關閉。") Cardapi_unini() $steprec -= 1 Return True ;Exit EndIf if $result[0] <> 0 Then Return False EndIf EndIf $steprec +=1 Return True EndFunc
  13. @TheXman Please see my steps of images.
  14. The Func __CryptoNG_IsKeyBitLengthValid($hAlgorithmProvider, $vEncryptionKey) have some issue, When I execute example it is fail and I'm found the issue is $tKeyLengthsStruct.dwIncrement = 0, Suggestion modify to ElseIf Mod($iEncryptKeyBitLength, $tKeyLengthsStruct.dwIncrement) <> 0 and $tKeyLengthsStruct.dwIncrement <> 0 Then. ,
  15. It is only reply the question let everybody know autoit can do it.
×
×
  • Create New...