首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用crypto api的本机代码的.NET等效项

使用crypto api的本机代码的.NET等效项
EN

Stack Overflow用户
提问于 2009-06-05 13:42:13
回答 2查看 6.4K关注 0票数 1

我有以下本机代码(Powerbuilder),使用Crypto API对字符串进行加密。我需要C#代码来解密加密的数据。有人能给我一个提示或样本吗?

谢谢,Jaap

代码语言:javascript
复制
private function blob of_encryptdecrypt (blob ablob_data, string as_password, boolean ab_encrypt)
// -----------------------------------------------------------------------------
// SCRIPT:     n_cryptoapi.of_EncryptDecrypt
//
// PURPOSE:    This function will encrypt/decrypt the blob passed to it. Both
//                  encrypt/decrypt have the same api calls except one so they
//                  are combined to save coding.
//
// ARGUMENTS:  ablob_data   - The blob to be decrypted
//                  as_password - The secret password
//
// RETURN:      Blob containing the decrypted data.
//
// DATE        PROG/ID      DESCRIPTION OF CHANGE / REASON
// ----------  --------     -----------------------------------------------------
// 12/26/2006   RolandS     Initial Coding
// -----------------------------------------------------------------------------

ULong hCryptProv, hHash, hKey
ULong lul_datalen, lul_buflen, lul_error
Blob lblob_buffer, lblob_value
String ls_msgtext
string ls_password

// Get handle to CSP
If Not CryptAcquireContext(hCryptProv, KEY_CONTAINER, is_cryptoservice, PROV_RSA_FULL, 0) Then
    If Not CryptAcquireContext(hCryptProv, KEY_CONTAINER, is_cryptoservice, PROV_RSA_FULL, CRYPT_NEWKEYSET) Then
        of_GetLastError(lul_error, ls_msgtext)
        SignalError(lul_error, "CryptAcquireContext:~r~n~r~n" + ls_msgtext)
    End If
End If

// Create a hash object
If Not CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, hHash) Then
    of_GetLastError(lul_error, ls_msgtext)
    SignalError(lul_error, "CryptCreateHash:~r~n~r~n" + ls_msgtext)
End If

// Hash the password
If Not CryptHashData(hHash,as_password, Len(as_password), 0) Then
    of_GetLastError(lul_error, ls_msgtext)
    SignalError(lul_error, "CryptHashData:~r~n~r~n" + ls_msgtext)
End If

// Derive a session key from the hash object
If Not CryptDeriveKey(hCryptProv, ENCRYPT_ALGORITHM, hHash, 0, hKey) Then
    of_GetLastError(lul_error, ls_msgtext)
    SignalError(lul_error, "CryptDeriveKey:~r~n~r~n" + ls_msgtext)
End If

// allocate buffer space
lul_datalen = Len(ablob_data)
lblob_buffer = ablob_data + Blob(Space(8))
lul_buflen = Len(lblob_buffer)

If ab_encrypt Then
    // Encrypt data
    If CryptEncrypt(hKey, 0, True, 0, lblob_buffer, lul_datalen, lul_buflen) Then
        lblob_value = BlobMid(lblob_buffer, 1, lul_datalen)
    Else
        of_GetLastError(lul_error, ls_msgtext)
        SignalError(lul_error, "CryptEncrypt:~r~n~r~n" + ls_msgtext)
    End If
Else
    // Decrypt data
    If CryptDecrypt(hKey, 0, True, 0, lblob_buffer, lul_datalen) Then
        lblob_value = BlobMid(lblob_buffer, 1, lul_datalen)
    Else
        of_GetLastError(lul_error, ls_msgtext)
        SignalError(lul_error, "CryptDecrypt:~r~n~r~n" + ls_msgtext)
    End If
End If

// Destroy session key
If hKey > 0 Then
    CryptDestroyKey(hKey)
End If

// Destroy hash object
If hHash > 0 Then
    CryptDestroyHash(hHash)
End If

// Release CSP handle
If hCryptProv > 0 Then
    CryptReleaseContext(hCryptProv, 0)
End If

Return lblob_value
end function
EN

回答 2

Stack Overflow用户

发布于 2009-06-05 15:54:44

您可以使用System.Security.Cryptography中的类在C#中执行相同的操作。

您将有效地对密码进行MD5散列,然后使用在全局常量ENCRYPT_ALGORITHM中定义的算法。您必须发布该变量的值才能得到更好的答案。但是,如果您正在使用任何常见的东西,那么很可能会为您提供一个*CryptoServiceProvider包装器。例如,AesCryptoServiceProvider

顺便说一句,使用密码的直接(例如非加盐) MD5散列可能是不好的。有关详细信息,请参阅this article

票数 3
EN

Stack Overflow用户

发布于 2009-06-05 14:41:54

您可以在此站点上查看PInvoke对CryptoAPI函数的引用:http://www.pinvoke.net

例如: DllImport("advapi32.dll",SetLastError=true) public static extern bool CryptHashData(IntPtr hHash,byte[] pbData,uint dataLen,uint flag);

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/955915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档