- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于维护原因,我正在将c++库移植到C#。我非常接近完成它,但是我将这段代码转换为不会返回相同值的base64。
输入:“probando”
C++
CryptSignMessage(&signParameters,
true,
1,
MessageArray,
MessageSizeArray,
NULL,
&signature.length)
MIIB8gYJKoZIhvcNAQcCoIIB4zCCAd8CAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGCAb4wggG6AgEBMIGWMH8xEjAQBgoJkiaJk/IsZAEZFgJhcjETMBEGCgmSJomT8ixkARkWA2NvbTEcMBoGCgmSJomT8ixkARkWDGJhbmNvZ2FsaWNpYTEVMBMGCgmSJomT8ixkARkWBWJnY216MR8wHQYDVQQDExZHYWxpY2lhIE9mZmljZSBDQS1TSEEyAhMbAAARQ28x78yrZlirAAEAABFDMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEAA1sSjgNMqSOQaElqHU1Mr0+aOqEwCFdhZAZzacFKs9dPGhUtR9I444YF5+422WJ+A7pd9wAlgejMflhF6lLr8ty/5pyy5BudNq4y1CIx7JSX87+7H1j2QIVIe1mPnKM1/IBD2g5IXDaTqt6S0QFVV9VRKjbe3fVCBo7hfV7gIo19nlBWi2eddEkOwUbqIDcfG/OpSeSkQvqxS/i215Cr3JpXnSSWRrB9ZDg956PI2j0nnAXnOZx/rYARy3btr+CXq1BHsCMclqEyjRZrrTkWT6lt8pqFxmGg0688qK8IWIKrurfgzTUtWMMWXhLQQ08Wa6/wACJyVUW9jgJdPCBp/A==
var bytes = Encoding.UTF8.GetBytes(textToSign);
var data = new ContentInfo(bytes);
var signedCms = new SignedCms(data, true);
var signer = new CmsSigner(cert);
signedCms.ComputeSignature(signer);
var sign = signedCms.Encode();
var encodedSign = Convert.ToBase64String(sign);
MIIH7QYJKoZIhvcNAQcCoIIH3jCCB9oCAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCCBfcwggXzMIID26ADAgECAhMbAAARQ28x78yrZlirAAEAABFDMA0GCSqGSIb3DQEBCwUAMH8xEjAQBgoJkiaJk/IsZAEZFgJhcjETMBEGCgmSJomT8ixkARkWA2NvbTEcMBoGCgmSJomT8ixkARkWDGJhbmNvZ2FsaWNpYTEVMBMGCgmSJomT8ixkARkWBWJnY216MR8wHQYDVQQDExZHYWxpY2lhIE9mZmljZSBDQS1TSEEyMB4XDTIwMDUwNjE3MjUyOVoXDTIyMDUwNjE3MzUyOVowgZUxMTAvBgNVBAgTKDczNDkzM0Y4MjczNzFBRDE5OUQ2OTZCQjc0ODU0NDAwRDcwNjg3NDgxETAPBgNVBAcTCDMxMjk2MzkyMRQwEgYDVQQKEwszMDU5MDM2MDc2MzETMBEGA1UEAxMKMDAwMDAyMTgwMjEiMCAGCSqGSIb3DQEJARYTKEwwNjk2MjAwKUdBTDE0Mjg5NzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMyyRN5tSC40a1fxb2PXIgxqk8KhMG3NgvjVl0YBcsJGnqodKACTZnhPcOaLPion4bgiB+9kKVzwuOA6hLhFWufhx546PS5hc1hcQpEl14inteeUsoU8Qq7ZHwJqJkynycoM4u2lgF60MHSItyhTZ4JDlLRBxMqxTzK62/99ts/fgs4YjRPZ0p40Hnqrzn1I+a8w/OfjwMUP3ROur5dv2onZmG0NZVakfidaBz7L5xQVLyKptcJeOJCxfxD19jvDtYQAoUjf5BNg8WZmFCEP7gKeZiezk9NhjF8dlvY5PAijp9T56V8BJhGdbU5+L2k9BVz501aEWzB7Kn48JBjYLj0CAwEAAaOCAU8wggFLMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1UdDgQWBBRub2ebFXjMmgSfKhKUpMrsEnN2VzAOBgNVHQ8BAf8EBAMCB4AwHwYDVR0jBBgwFoAUYcnXK5RZloafBqML9XLhJiurQSEwSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL0dPQ0EyMy9DZXJ0RW5yb2xsL0dhbGljaWElMjBPZmZpY2UlMjBDQS1TSEEyKDEpLmNybDCBlgYIKwYBBQUHAQEEgYkwgYYwgYMGCCsGAQUFBzAChndmaWxlOi8vLy9HT0NBMjMuYmdjbXouYmFuY29nYWxpY2lhLmNvbS5hci9DZXJ0RW5yb2xsL0dPQ0EyMy5iZ2Ntei5iYW5jb2dhbGljaWEuY29tLmFyX0dhbGljaWElMjBPZmZpY2UlMjBDQS1TSEEyKDEpLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAL+6Ik6zzaP0+3POv4oRGX1mmoy7njoHMDawvFKT6HuuHnfsd50YhxWJgYXjFTW2io1h0XAO3AG1Yup5YUl3aXGCu82D3NOU2JG5t7dAkZ4s+NxGCtPgbHNRcuekOY4P5O5bY1umhrFoxjTsH/tI6UjiyLWDWIy9Hv97gYrnW33KLA6XADI9ygwF6yfAQKJaw4ZD/q0JE/82ovyUYGcp6eu5z253bXmSgfA2GU6FBiilcYin4GitWQrIcGTrLRcMeOjBYOjESHW4Am8OQDePURg25NXNOEBAtQk6cUj3kzv0M7/GipdRGZ8TgM6hy35HfnxG1EmiTZVft/GGsc1hhc9jeyn0llV6TLplm81XkCZavK0izAxovU+n7LHPVNBvvqcwAmM8GBp/P/a30TatO1b2iHrayLQl37Th6TJongqaPofNryadAK8clMJaeM5ocFFTEkPFbvmX1VLt7fdBWyB96MZg9C/NNmD0y4kNbDT+ZsmeEjzfk0LZxLcnZ5MMeC1fqAehQN3zCiN66CChokBBhAbLTM0eQKgWYrYNxA+tEYcRfgtKc9CSu+L28p/Ht3nZTrzjONAzIbdQhC/MZCgEf7Bve21M8ODve1/E+RR//R701spT7fGicLWKYzsQDVUUlnzJSKcGZGpJ+fQiSKsZ5zQvQ0Yixqr/wV/ciOIcxggG+MIIBugIBATCBljB/MRIwEAYKCZImiZPyLGQBGRYCYXIxEzARBgoJkiaJk/IsZAEZFgNjb20xHDAaBgoJkiaJk/IsZAEZFgxiYW5jb2dhbGljaWExFTATBgoJkiaJk/IsZAEZFgViZ2NtejEfMB0GA1UEAxMWR2FsaWNpYSBPZmZpY2UgQ0EtU0hBMgITGwAAEUNvMe/Mq2ZYqwABAAARQzAJBgUrDgMCGgUAMA0GCSqGSIb3DQEBAQUABIIBAANbEo4DTKkjkGhJah1NTK9PmjqhMAhXYWQGc2nBSrPXTxoVLUfSOOOGBefuNtlifgO6XfcAJYHozH5YRepS6/Lcv+acsuQbnTauMtQiMeyUl/O/ux9Y9kCFSHtZj5yjNfyAQ9oOSFw2k6rektEBVVfVUSo23t31QgaO4X1e4CKNfZ5QVotnnXRJDsFG6iA3HxvzqUnkpEL6sUv4tteQq9yaV50klkawfWQ4PeejyNo9J5wF5zmcf62AEct27a/gl6tQR7AjHJahMo0Wa605Fk+pbfKahcZhoNOvPKivCFiCq7q34M01LVjDFl4S0ENPFmuv8AAiclVFvY4CXTwgafw=
var sign = cert.GetRSAPrivateKey().SignData(bytes, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
A1sSjgNMqSOQaElqHU1Mr0+aOqEwCFdhZAZzacFKs9dPGhUtR9I444YF5+422WJ+A7pd9wAlgejMflhF6lLr8ty/5pyy5BudNq4y1CIx7JSX87+7H1j2QIVIe1mPnKM1/IBD2g5IXDaTqt6S0QFVV9VRKjbe3fVCBo7hfV7gIo19nlBWi2eddEkOwUbqIDcfG/OpSeSkQvqxS/i215Cr3JpXnSSWRrB9ZDg956PI2j0nnAXnOZx/rYARy3btr+CXq1BHsCMclqEyjRZrrTkWT6lt8pqFxmGg0688qK8IWIKrurfgzTUtWMMWXhLQQ08Wa6/wACJyVUW9jgJdPCBp/A==
signParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
signParams.dwMsgEncodingType = MY_ENCODING_TYPE;
signParams.pSigningCert = certificate;
signParams.HashAlgorithm.pszObjId = (char *)szOID_OIWSEC_sha1;
signParams.HashAlgorithm.Parameters.cbData = NULL;
signParams.cMsgCert = 0;
signParams.rgpMsgCert = NULL;
signParams.cAuthAttr = 0;
signParams.dwInnerContentType = 0;
signParams.cMsgCrl = 0;
signParams.cUnauthAttr = 0;
signParams.dwFlags = 0;
signParams.pvHashAuxInfo = NULL;
signParams.rgAuthAttr = NULL;
MIIB8gYJKoZIhvcNAQcCoIIB4zCCAd8CAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGCAb4wggG6AgEBMIGWMH8xEjAQBgoJkiaJk/IsZAEZFgJhcjETMBEGCgmSJomT8ixkARkWA2NvbTEcMBoGCgmSJomT8ixkARkWDGJhbmNvZ2FsaWNpYTEVMBMGCgmSJomT8ixkARkWBWJnY216MR8wHQYDVQQDExZHYWxpY2lhIE9mZmljZSBDQS1TSEEyAhMbAAARQ28x78yrZlirAAEAABFDMAkGBSsOAwIaBQAwDQYJKoZIhvcNAQEBBQAEggEA
最佳答案
我最终使用了DllImport,look at this post
我会在这里复制它,以防源被删除。
using System;
using System.Text;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
// Parameters.
//
String sSignerName = "ALEJANDRO CAMPOS MAGENCIO";
String sMessage = "CryptoAPI is a good way to handle security";
// Variables.
//
Byte[] pbMessage = null;
Int32 cbMessage = 0;
IntPtr[] MessageArray = null;
Int32[] MessageSizeArray = null;
IntPtr hStoreHandle = IntPtr.Zero;
IntPtr pSignerCert = IntPtr.Zero;
Crypto.CRYPT_SIGN_MESSAGE_PARA SigParams;
Boolean res = false;
Int32 cbSignedMessageBlob = 0;
Byte[] pbSignedMessageBlob = null;
Crypto.CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
Int32 cbDecodedMessageBlob = 0;
Byte[] pbDecodedMessageBlob = null;
try
{
// Begin processing. Display the original message.
//
Console.WriteLine("-------------------------------------");
Console.WriteLine("MESSAGE TO SIGN:\n");
Console.WriteLine(sMessage + "\n\n");
// Size of message.
//
pbMessage = (new UnicodeEncoding()).GetBytes(sMessage);
cbMessage = pbMessage.Length;
// Create the MessageArray and the MessageSizeArray.
//
MessageArray = new IntPtr[1];
MessageArray[0] = Marshal.AllocHGlobal(pbMessage.Length);
Marshal.Copy(pbMessage, 0, MessageArray[0], pbMessage.Length);
MessageSizeArray = new Int32[1];
MessageSizeArray[0] = cbMessage;
// Open a certificate store.
//
hStoreHandle = Crypto.CertOpenStore(
Crypto.CERT_STORE_PROV_SYSTEM,
0,
IntPtr.Zero,
Crypto.CERT_SYSTEM_STORE_CURRENT_USER,
Crypto.CERT_PERSONAL_STORE_NAME
);
if (hStoreHandle == IntPtr.Zero)
{
throw new Exception("CertOpenStore error", new Win32Exception(Marshal.GetLastWin32Error()));
}
// Get a pointer to the signer's certificate.
// This certificate must have access to the signer's private key.
pSignerCert = Crypto.CertFindCertificateInStore(
hStoreHandle,
Crypto.MY_TYPE,
0,
Crypto.CERT_FIND_SUBJECT_STR,
sSignerName,
IntPtr.Zero
);
if (pSignerCert == IntPtr.Zero)
{
throw new Exception("CertFindCertificateInStore error", new Win32Exception(Marshal.GetLastWin32Error()));
}
// Initialize the signature structure.
//
SigParams = new Crypto.CRYPT_SIGN_MESSAGE_PARA();
SigParams.cbSize = Marshal.SizeOf(SigParams);
SigParams.dwMsgEncodingType = Crypto.MY_TYPE;
SigParams.pSigningCert = pSignerCert;
SigParams.HashAlgorithm.pszObjId = Crypto.szOID_OIWSEC_sha1;
SigParams.HashAlgorithm.Parameters.pbData = IntPtr.Zero;
SigParams.HashAlgorithm.Parameters.cbData = 0;
SigParams.pvHashAuxInfo = IntPtr.Zero;
SigParams.cMsgCert = 1;
GCHandle GC = GCHandle.Alloc(pSignerCert, GCHandleType.Pinned);
SigParams.rgpMsgCert = GC.AddrOfPinnedObject();
GC.Free();
SigParams.cMsgCrl = 0;
SigParams.rgpMsgCrl = IntPtr.Zero;
SigParams.cAuthAttr = 0;
SigParams.rgAuthAttr = IntPtr.Zero;
SigParams.cUnauthAttr = 0;
SigParams.rgUnauthAttr = IntPtr.Zero;
SigParams.dwFlags = 0;
SigParams.dwInnerContentType = 0;
// With two calls to CryptSignMessage, sign the message.
// First, get the size of the output signed BLOB.
//
res = Crypto.CryptSignMessage(
ref SigParams, // Signature parameters
false, // Not detached
1, // Number of messages
MessageArray, // Messages to be signed
MessageSizeArray, // Size of messages
null, // Buffer for signed message
ref cbSignedMessageBlob // Size of buffer
);
if (res == false)
{
throw new Exception("CryptSignMessage error", new Win32Exception(Marshal.GetLastWin32Error()));
}
// Allocate memory for the signed BLOB.
//
pbSignedMessageBlob = new Byte[cbSignedMessageBlob];
// Get the SignedMessageBlob.
//
res = Crypto.CryptSignMessage(
ref SigParams, // Signature parameters
false, // Not detached
1, // Number of messages
MessageArray, // Messages to be signed
MessageSizeArray, // Size of messages
pbSignedMessageBlob, // Buffer for signed message
ref cbSignedMessageBlob // Size of buffer
);
if (res == false)
{
throw new Exception("CryptSignMessage error", new Win32Exception(Marshal.GetLastWin32Error()));
}
// pbSignedMessageBlob points to the signed BLOB. Display the signature.
//
Console.WriteLine("-------------------------------------");
Console.WriteLine("SIGNATURE:\n");
Console.WriteLine(Convert.ToBase64String(pbSignedMessageBlob) + "\n\n");
// Verify the message signature. Usually, this
// would be done in a separate program.
//
// Initialize the VerifyParams data structure.
//
VerifyParams = new Crypto.CRYPT_VERIFY_MESSAGE_PARA();
VerifyParams.cbSize = Marshal.SizeOf(VerifyParams);
VerifyParams.dwMsgAndCertEncodingType = Crypto.MY_TYPE;
VerifyParams.hCryptProv = IntPtr.Zero;
VerifyParams.pfnGetSignerCertificate = IntPtr.Zero;
VerifyParams.pvGetArg = IntPtr.Zero;
// With two calls to CryptVerifyMessageSignature, verify and decode
// the signed message.
// First, call CryptVerifyMessageSignature to get the length of the
// buffer needed to hold the decoded message.
//
res = Crypto.CryptVerifyMessageSignature(
ref VerifyParams, // Verify parameters.
0, // Signer index.
pbSignedMessageBlob, // Pointer to signed BLOB.
cbSignedMessageBlob, // Size of signed BLOB.
null, // Buffer for decoded message.
ref cbDecodedMessageBlob, // Size of buffer.
IntPtr.Zero // Pointer to signer certificate.
);
if (res == false)
{
throw new Exception("CryptVerifyMessageSignature error", new Win32Exception(Marshal.GetLastWin32Error()));
}
// Allocate memory for the buffer.
//
pbDecodedMessageBlob = new Byte[cbDecodedMessageBlob];
// Call CryptVerifyMessageSignature again to copy the message into
// the buffer.
//
res = Crypto.CryptVerifyMessageSignature(
ref VerifyParams, // Verify parameters.
0, // Signer index.
pbSignedMessageBlob, // Pointer to signed BLOB.
cbSignedMessageBlob, // Size of signed BLOB.
pbDecodedMessageBlob, // Buffer for decoded message.
ref cbDecodedMessageBlob, // Size of buffer.
IntPtr.Zero // Pointer to signer certificate.
);
if (res == false)
{
throw new Exception("CryptVerifyMessageSignature error", new Win32Exception(Marshal.GetLastWin32Error()));
}
else
{
// Display attached message to signature.
//
Console.WriteLine("-------------------------------------");
Console.WriteLine("SIGNATURE VERIFIED!!!\n\n");
Console.WriteLine("-------------------------------------");
Console.WriteLine("ATTACHED MESSAGE:\n");
Console.WriteLine((new UnicodeEncoding()).GetString(pbDecodedMessageBlob) + "\n\n");
}
}
catch (Exception ex)
{
// Any errors? Show them.
//
if (ex.InnerException == null)
{
Console.WriteLine(ex.Message + "\n\n");
}
else
{
Console.WriteLine(ex.Message + " --> " + ex.InnerException.Message + "\n\n");
}
}
finally
{
// Clean up and free memory.
//
if (MessageArray[0] != IntPtr.Zero)
{
Marshal.FreeHGlobal(MessageArray[0]);
}
if (pSignerCert != IntPtr.Zero)
{
Crypto.CertFreeCertificateContext(pSignerCert);
}
if (hStoreHandle != IntPtr.Zero)
{
Crypto.CertCloseStore(
hStoreHandle,
Crypto.CERT_CLOSE_STORE_CHECK_FLAG
);
}
}
Console.WriteLine("<<Press ENTER to continue>>" + "\n");
Console.ReadLine();
}
}
}
和
using System;
using System.Runtime.InteropServices;
public class Crypto
{
#region CONSTS
// #define CERT_PERSONAL_STORE_NAME L"My"
public const string CERT_PERSONAL_STORE_NAME = "My";
// #define CERT_COMPARE_NAME 2
public const Int32 CERT_COMPARE_NAME = 2;
// #define CERT_INFO_SUBJECT_FLAG 7
public const Int32 CERT_INFO_SUBJECT_FLAG = 7;
// #define CERT_COMPARE_SHIFT 16
public const Int32 CERT_COMPARE_SHIFT = 16;
// #define CERT_FIND_SUBJECT_NAME (CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
public const Int32 CERT_FIND_SUBJECT_NAME =
(CERT_COMPARE_NAME << CERT_COMPARE_SHIFT) | CERT_INFO_SUBJECT_FLAG;
// #define CERT_COMPARE_NAME_STR_W 8
public const Int32 CERT_COMPARE_NAME_STR_W = 8;
// #define CERT_FIND_SUBJECT_STR_W // (CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)
public const Int32 CERT_FIND_SUBJECT_STR_W =
(CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT) | CERT_INFO_SUBJECT_FLAG;
// #define CERT_FIND_SUBJECT_STR CERT_FIND_SUBJECT_STR_W
public const Int32 CERT_FIND_SUBJECT_STR = CERT_FIND_SUBJECT_STR_W;
// #define CERT_STORE_PROV_SYSTEM_W ((LPCSTR) 10)
public const Int32 CERT_STORE_PROV_SYSTEM_W = 10;
// #define CERT_STORE_PROV_SYSTEM CERT_STORE_PROV_SYSTEM_W
public const Int32 CERT_STORE_PROV_SYSTEM = CERT_STORE_PROV_SYSTEM_W;
// #define CERT_SYSTEM_STORE_CURRENT_USER_ID 1
public const Int32 CERT_SYSTEM_STORE_CURRENT_USER_ID = 1;
// #define CERT_SYSTEM_STORE_LOCATION_SHIFT 16
public const Int32 CERT_SYSTEM_STORE_LOCATION_SHIFT = 16;
// #define CERT_SYSTEM_STORE_CURRENT_USER // (CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)
public const Int32 CERT_SYSTEM_STORE_CURRENT_USER =
CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT;
// #define CERT_CLOSE_STORE_CHECK_FLAG 0x00000002
public const Int32 CERT_CLOSE_STORE_CHECK_FLAG = 0x00000002;
// #define ALG_CLASS_HASH (4 << 13)
// #define ALG_TYPE_ANY (0)
// #define ALG_SID_SHA1 4
// #define CALG_SHA1 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)
public const Int32 CALG_SHA1 = (4 << 13) | 4;
// #define ALG_CLASS_SIGNATURE (1 << 13)
// #define ALG_TYPE_RSA (2 << 9)
// #define ALG_SID_RSA_ANY 0
// #define CALG_RSA_SIGN (ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY)
public const Int32 CALG_RSA_SIGN = (1 << 13) | (2 << 9);
// #define PROV_RSA_FULL 1
public const Int32 PROV_RSA_FULL = 0x00000001;
// #define CRYPT_VERIFYCONTEXT 0xF0000000
public const UInt32 CRYPT_VERIFYCONTEXT = 0xF0000000; //No private key access required
// #define X509_ASN_ENCODING 0x00000001
public const Int32 X509_ASN_ENCODING = 0x00000001;
// #define PKCS_7_ASN_ENCODING 0x00010000
public const Int32 PKCS_7_ASN_ENCODING = 0x00010000;
// #define MY_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
public const Int32 MY_TYPE = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
// #define HP_HASHVAL 0x0002
public const Int32 HP_HASHVAL = 0x00000002;
// #define HP_HASHSIZE 0x0004
public const Int32 HP_HASHSIZE = 0x00000004;
// #define PUBLICKEYBLOBEX 0xA
public const Int32 PUBLICKEYBLOBEX = 0x0A;
// #define PUBLICKEYBLOB 0x6
public const Int32 PUBLICKEYBLOB = 0x06;
// #define CUR_BLOB_VERSION 0x02
public const Int32 CUR_BLOB_VERSION = 0x02;
// #define CRYPT_EXPORTABLE 0x00000001
public const Int32 CRYPT_EXPORTABLE = 0x00000001;
// #define szOID_RSA_MD5 "1.2.840.113549.2.5"
public const String szOID_RSA_MD5 = "1.2.840.113549.2.5";
// #define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4"
public const String szOID_RSA_MD5RSA = "1.2.840.113549.1.1.4";
// #define szOID_OIWSEC_sha1 "1.3.14.3.2.26"
public const String szOID_OIWSEC_sha1 = "1.3.14.3.2.26";
#endregion
#region STRUCTS
// typedef struct _PUBLICKEYSTRUC
// {
// BYTE bType;
// BYTE bVersion;
// WORD reserved;
// ALG_ID aiKeyAlg;
// } BLOBHEADER, PUBLICKEYSTRUC;
[StructLayout(LayoutKind.Sequential)]
public struct PUBLICKEYSTRUC
{
public Byte bType;
public Byte bVersion;
public Int16 reserved;
public Int32 aiKeyAlg;
}
// typedef struct _RSAPUBKEY
// {
// DWORD magic;
// DWORD bitlen;
// DWORD pubexp;
// } RSAPUBKEY;
[StructLayout(LayoutKind.Sequential)]
public struct RSAPUBKEY
{
public Int32 magic;
public Int32 bitlen;
public Int32 pubexp;
}
// typedef struct _CRYPTOAPI_BLOB
// {
// DWORD cbData;
// BYTE *pbData;
// } CRYPT_HASH_BLOB, CRYPT_INTEGER_BLOB,
// CRYPT_OBJID_BLOB, CERT_NAME_BLOB;
[StructLayout(LayoutKind.Sequential)]
public struct CRYPTOAPI_BLOB
{
public Int32 cbData;
public IntPtr pbData;
}
// typedef struct _CRYPT_ALGORITHM_IDENTIFIER
// {
// LPSTR pszObjId;
// CRYPT_OBJID_BLOB Parameters;
// } CRYPT_ALGORITHM_IDENTIFIER;
[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_ALGORITHM_IDENTIFIER
{
[MarshalAs(UnmanagedType.LPStr)]public String pszObjId;
public CRYPTOAPI_BLOB Parameters;
}
// typedef struct _CRYPT_SIGN_MESSAGE_PARA
// {
// DWORD cbSize;
// DWORD dwMsgEncodingType;
// PCCERT_CONTEXT pSigningCert;
// CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
// void *pvHashAuxInfo;
// DWORD cMsgCert;
// PCCERT_CONTEXT *rgpMsgCert;
// DWORD cMsgCrl;
// PCCRL_CONTEXT *rgpMsgCrl;
// DWORD cAuthAttr;
// PCRYPT_ATTRIBUTE rgAuthAttr;
// DWORD cUnauthAttr;
// PCRYPT_ATTRIBUTE rgUnauthAttr;
// DWORD dwFlags;
// DWORD dwInnerContentType;
// } CRYPT_SIGN_MESSAGE_PARA;
[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_SIGN_MESSAGE_PARA
{
public Int32 cbSize;
public Int32 dwMsgEncodingType;
public IntPtr pSigningCert;
public CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
public IntPtr pvHashAuxInfo;
public Int32 cMsgCert;
public IntPtr rgpMsgCert;
public Int32 cMsgCrl;
public IntPtr rgpMsgCrl;
public Int32 cAuthAttr;
public IntPtr rgAuthAttr;
public Int32 cUnauthAttr;
public IntPtr rgUnauthAttr;
public Int32 dwFlags;
public Int32 dwInnerContentType;
}
// typedef struct _CRYPT_VERIFY_MESSAGE_PARA
// {
// DWORD cbSize;
// DWORD dwMsgAndCertEncodingType;
// HCRYPTPROV hCryptProv;
// PFN_CRYPT_GET_SIGNER_CERTIFICATE pfnGetSignerCertificate;
// void *pvGetArg;
// } CRYPT_VERIFY_MESSAGE_PARA;
[StructLayout(LayoutKind.Sequential)]
public struct CRYPT_VERIFY_MESSAGE_PARA
{
public Int32 cbSize;
public Int32 dwMsgAndCertEncodingType;
public IntPtr hCryptProv;
public IntPtr pfnGetSignerCertificate;
public IntPtr pvGetArg;
}
#endregion
#region FUNCTIONS (IMPORTS)
[DllImport("Crypt32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern IntPtr CertOpenStore(
Int32 lpszStoreProvider,
Int32 dwMsgAndCertEncodingType,
IntPtr hCryptProv,
Int32 dwFlags,
String pvPara
);
[DllImport("Crypt32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern IntPtr CertOpenSystemStore(
IntPtr hprov,
String szSubsystemProtocol
);
[DllImport("Crypt32.dll", SetLastError=true)]
public static extern Boolean CertCloseStore(
IntPtr hCertStore,
Int32 dwFlags
);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool CryptAcquireContext(
ref IntPtr hProv,
String pszContainer,
String pszProvider,
Int32 dwProvType,
Int32 dwFlags
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptCreateHash(
IntPtr hProv,
Int32 Algid,
IntPtr hKey,
Int32 dwFlags,
ref IntPtr phHash
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptGetHashParam(
IntPtr hHash,
Int32 dwParam,
ref Int32 pbData,
ref Int32 pdwDataLen,
Int32 dwFlags
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptSetHashParam(
IntPtr hHash,
Int32 dwParam,
Byte[] pbData,
Int32 dwFlags
);
[DllImport("crypt32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool CryptImportPublicKeyInfo(
IntPtr hCryptProv,
Int32 dwCertEncodingType,
IntPtr pInfo,
ref IntPtr phKey
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptImportKey(
IntPtr hProv,
Byte[] pbData,
Int32 dwDataLen,
IntPtr hPubKey,
Int32 dwFlags,
ref IntPtr phKey
);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool CryptVerifySignature(
IntPtr hHash,
Byte[] pbSignature,
Int32 dwSigLen,
IntPtr hPubKey,
String sDescription,
Int32 dwFlags
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptDestroyKey(
IntPtr hKey
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptDestroyHash(
IntPtr hHash
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptReleaseContext(
IntPtr hProv,
Int32 dwFlags
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptGenKey(
IntPtr hProv,
Int32 Algid,
Int32 dwFlags,
ref IntPtr phKey
);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CryptExportKey(
IntPtr hKey,
IntPtr hExpKey,
Int32 dwBlobType,
Int32 dwFlags,
Byte[] pbData,
ref Int32 pdwDataLen
);
[DllImport("Crypt32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern IntPtr CertFindCertificateInStore(
IntPtr hCertStore,
Int32 dwCertEncodingType,
Int32 dwFindFlags,
Int32 dwFindType,
String pvFindPara,
IntPtr pPrevCertContext
);
[DllImport("Crypt32.dll", SetLastError=true)]
public static extern Boolean CertFreeCertificateContext(
IntPtr pCertContext
);
[DllImport("Crypt32.dll", SetLastError=true)]
public static extern Boolean CryptSignMessage (
ref CRYPT_SIGN_MESSAGE_PARA pSignPara,
Boolean fDetachedSignature,
Int32 cToBeSigned,
IntPtr[] rgpbToBeSigned,
Int32[] rgcbToBeSigned,
Byte[] pbSignedBlob,
ref Int32 pcbSignedBlob
);
[DllImport("Crypt32.dll", SetLastError=true)]
public static extern Boolean CryptVerifyMessageSignature (
ref CRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
Int32 dwSignerIndex,
Byte[] pbSignedBlob,
Int32 cbSignedBlob,
Byte[] pbDecoded,
ref Int32 pcbDecoded,
IntPtr ppSignerCert
);
#endregion
#region FUNTIONS
// Helper function to convert struts & classes to byte array
public static byte[] RawSerialize(object anything)
{
int rawsize = Marshal.SizeOf(anything);
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.StructureToPtr(anything, buffer, false);
byte[] rawdatas = new byte[rawsize];
Marshal.Copy(buffer, rawdatas, 0, rawsize);
Marshal.FreeHGlobal(buffer);
return rawdatas;
}
#endregion
}
关于c# - 将C++ Pkcs7符号移植到C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328665/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!