日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

JAVA/PHP/C#版RSA验签--转

發(fā)布時間:2025/4/5 C# 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA/PHP/C#版RSA验签--转 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文是上一篇文章的兄弟篇,上篇文章介紹了客戶端的sdk中如何基于JAVA/PHP/C#使用RSA私鑰簽名,然后服務(wù)端基于JAVA使用RSA公鑰驗(yàn)簽,客戶端簽名/服務(wù)端驗(yàn)簽的模式只能幫助服務(wù)端檢查客戶端來的請求數(shù)據(jù)是否被篡改,同樣的,客戶端也需要對服務(wù)端的返回結(jié)果檢查是否被篡改,因此就引出了本片文章。

?

? ? ? ?Java版的驗(yàn)簽和加簽均已在上一篇文章中分析過,客戶端和服務(wù)端的邏輯是一樣的,此處不再贅述。下面重點(diǎn)分析如何基于RSA的PEM文件,使用php和c#進(jìn)行驗(yàn)簽。

?

1、php驗(yàn)簽

function verify($data, $sign, $rsaPublicKeyFilePath) {//讀取公鑰文件$pubKey = file_get_contents($rsaPublicKeyFilePath);//轉(zhuǎn)換為openssl格式密鑰$res = openssl_get_publickey($pubKey);//調(diào)用openssl內(nèi)置方法驗(yàn)簽,返回bool值$result = (bool)openssl_verify($data, base64_decode($sign), $res);//釋放資源 openssl_free_key($res);//返回資源是否成功return $result; }

?注意:$ rsaPublicKeyFilePath為pem公鑰文件路徑

?

2、?c#驗(yàn)簽

public static bool VerifySignedHash(string str_DataToVerify, string str_SignedData, string str_publicKeyFilePath){byte[] SignedData = Convert.FromBase64String(str_SignedData);ASCIIEncoding ByteConverter = new ASCIIEncoding();byte[] DataToVerify = ByteConverter.GetBytes(str_DataToVerify);try{string sPublicKeyPEM = File.ReadAllText(str_publicKeyFilePath);RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();rsa.PersistKeyInCsp = false;rsa.LoadPublicKeyPEM(sPublicKeyPEM);return rsa.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData);}catch (CryptographicException e){Console.WriteLine(e.Message);return false;}}

?注:str_publicKeyFilePath為RSA公鑰文件路徑

此處用到了c#的Extension methods,需要對RSACryptoServiceProvider進(jìn)行擴(kuò)展,擴(kuò)展類為RSACryptoServiceProviderExtension

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Runtime.InteropServices; using System.Security.Cryptography;namespace sdk {/// <summary>Extension method for initializing a RSACryptoServiceProvider from PEM data string.</summary>public static class RSACryptoServiceProviderExtension{#region Methods/// <summary>Extension method which initializes an RSACryptoServiceProvider from a DER public key blob.</summary>public static void LoadPublicKeyDER(this RSACryptoServiceProvider provider, byte[] DERData){byte[] RSAData = RSACryptoServiceProviderExtension.GetRSAFromDER(DERData);byte[] publicKeyBlob = RSACryptoServiceProviderExtension.GetPublicKeyBlobFromRSA(RSAData);provider.ImportCspBlob(publicKeyBlob);}/// <summary>Extension method which initializes an RSACryptoServiceProvider from a DER private key blob.</summary>public static void LoadPrivateKeyDER(this RSACryptoServiceProvider provider, byte[] DERData){byte[] privateKeyBlob = RSACryptoServiceProviderExtension.GetPrivateKeyDER(DERData);provider.ImportCspBlob(privateKeyBlob);}/// <summary>Extension method which initializes an RSACryptoServiceProvider from a PEM public key string.</summary>public static void LoadPublicKeyPEM(this RSACryptoServiceProvider provider, string sPEM){byte[] DERData = RSACryptoServiceProviderExtension.GetDERFromPEM(sPEM);RSACryptoServiceProviderExtension.LoadPublicKeyDER(provider, DERData);}/// <summary>Extension method which initializes an RSACryptoServiceProvider from a PEM private key string.</summary>public static void LoadPrivateKeyPEM(this RSACryptoServiceProvider provider, string sPEM){byte[] DERData = RSACryptoServiceProviderExtension.GetDERFromPEM(sPEM);RSACryptoServiceProviderExtension.LoadPrivateKeyDER(provider, DERData);}/// <summary>Returns a public key blob from an RSA public key.</summary>internal static byte[] GetPublicKeyBlobFromRSA(byte[] RSAData){byte[] data = null;UInt32 dwCertPublicKeyBlobSize = 0;if (RSACryptoServiceProviderExtension.CryptDecodeObject(CRYPT_ENCODING_FLAGS.X509_ASN_ENCODING | CRYPT_ENCODING_FLAGS.PKCS_7_ASN_ENCODING,new IntPtr((int)CRYPT_OUTPUT_TYPES.RSA_CSP_PUBLICKEYBLOB), RSAData, (UInt32)RSAData.Length, CRYPT_DECODE_FLAGS.NONE,data, ref dwCertPublicKeyBlobSize)){data = new byte[dwCertPublicKeyBlobSize];if (!RSACryptoServiceProviderExtension.CryptDecodeObject(CRYPT_ENCODING_FLAGS.X509_ASN_ENCODING | CRYPT_ENCODING_FLAGS.PKCS_7_ASN_ENCODING,new IntPtr((int)CRYPT_OUTPUT_TYPES.RSA_CSP_PUBLICKEYBLOB), RSAData, (UInt32)RSAData.Length, CRYPT_DECODE_FLAGS.NONE,data, ref dwCertPublicKeyBlobSize))throw new Win32Exception(Marshal.GetLastWin32Error());}elsethrow new Win32Exception(Marshal.GetLastWin32Error());return data;}/// <summary>Converts DER binary format to a CAPI CRYPT_PRIVATE_KEY_INFO structure.</summary>internal static byte[] GetPrivateKeyDER(byte[] DERData){byte[] data = null;UInt32 dwRSAPrivateKeyBlobSize = 0;IntPtr pRSAPrivateKeyBlob = IntPtr.Zero;if (RSACryptoServiceProviderExtension.CryptDecodeObject(CRYPT_ENCODING_FLAGS.X509_ASN_ENCODING | CRYPT_ENCODING_FLAGS.PKCS_7_ASN_ENCODING, new IntPtr((int)CRYPT_OUTPUT_TYPES.PKCS_RSA_PRIVATE_KEY),DERData, (UInt32)DERData.Length, CRYPT_DECODE_FLAGS.NONE, data, ref dwRSAPrivateKeyBlobSize)){data = new byte[dwRSAPrivateKeyBlobSize];if (!RSACryptoServiceProviderExtension.CryptDecodeObject(CRYPT_ENCODING_FLAGS.X509_ASN_ENCODING | CRYPT_ENCODING_FLAGS.PKCS_7_ASN_ENCODING, new IntPtr((int)CRYPT_OUTPUT_TYPES.PKCS_RSA_PRIVATE_KEY),DERData, (UInt32)DERData.Length, CRYPT_DECODE_FLAGS.NONE, data, ref dwRSAPrivateKeyBlobSize))throw new Win32Exception(Marshal.GetLastWin32Error());}elsethrow new Win32Exception(Marshal.GetLastWin32Error());return data;}/// <summary>Converts DER binary format to a CAPI CERT_PUBLIC_KEY_INFO structure containing an RSA key.</summary>internal static byte[] GetRSAFromDER(byte[] DERData){byte[] data = null;byte[] publicKey = null;CERT_PUBLIC_KEY_INFO info;UInt32 dwCertPublicKeyInfoSize = 0;IntPtr pCertPublicKeyInfo = IntPtr.Zero;if (RSACryptoServiceProviderExtension.CryptDecodeObject(CRYPT_ENCODING_FLAGS.X509_ASN_ENCODING | CRYPT_ENCODING_FLAGS.PKCS_7_ASN_ENCODING, new IntPtr((int)CRYPT_OUTPUT_TYPES.X509_PUBLIC_KEY_INFO),DERData, (UInt32)DERData.Length, CRYPT_DECODE_FLAGS.NONE, data, ref dwCertPublicKeyInfoSize)){data = new byte[dwCertPublicKeyInfoSize];if (RSACryptoServiceProviderExtension.CryptDecodeObject(CRYPT_ENCODING_FLAGS.X509_ASN_ENCODING | CRYPT_ENCODING_FLAGS.PKCS_7_ASN_ENCODING, new IntPtr((int)CRYPT_OUTPUT_TYPES.X509_PUBLIC_KEY_INFO),DERData, (UInt32)DERData.Length, CRYPT_DECODE_FLAGS.NONE, data, ref dwCertPublicKeyInfoSize)){GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned);try{info = (CERT_PUBLIC_KEY_INFO)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(CERT_PUBLIC_KEY_INFO));publicKey = new byte[info.PublicKey.cbData];Marshal.Copy(info.PublicKey.pbData, publicKey, 0, publicKey.Length);}finally{handle.Free();}}elsethrow new Win32Exception(Marshal.GetLastWin32Error());}elsethrow new Win32Exception(Marshal.GetLastWin32Error());return publicKey;}/// <summary>Extracts the binary data from a PEM file.</summary>internal static byte[] GetDERFromPEM(string sPEM){UInt32 dwSkip, dwFlags;UInt32 dwBinarySize = 0;if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (UInt32)sPEM.Length, CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, null, ref dwBinarySize, out dwSkip, out dwFlags))throw new Win32Exception(Marshal.GetLastWin32Error());byte[] decodedData = new byte[dwBinarySize];if (!RSACryptoServiceProviderExtension.CryptStringToBinary(sPEM, (UInt32)sPEM.Length, CRYPT_STRING_FLAGS.CRYPT_STRING_BASE64HEADER, decodedData, ref dwBinarySize, out dwSkip, out dwFlags))throw new Win32Exception(Marshal.GetLastWin32Error());return decodedData;}#endregion Methods#region P/Invoke Constants/// <summary>Enumeration derived from Crypto API.</summary>internal enum CRYPT_ACQUIRE_CONTEXT_FLAGS : uint{CRYPT_NEWKEYSET = 0x8,CRYPT_DELETEKEYSET = 0x10,CRYPT_MACHINE_KEYSET = 0x20,CRYPT_SILENT = 0x40,CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x80,CRYPT_VERIFYCONTEXT = 0xF0000000}/// <summary>Enumeration derived from Crypto API.</summary>internal enum CRYPT_PROVIDER_TYPE : uint{PROV_RSA_FULL = 1}/// <summary>Enumeration derived from Crypto API.</summary>internal enum CRYPT_DECODE_FLAGS : uint{NONE = 0,CRYPT_DECODE_ALLOC_FLAG = 0x8000}/// <summary>Enumeration derived from Crypto API.</summary>internal enum CRYPT_ENCODING_FLAGS : uint{PKCS_7_ASN_ENCODING = 0x00010000,X509_ASN_ENCODING = 0x00000001,}/// <summary>Enumeration derived from Crypto API.</summary>internal enum CRYPT_OUTPUT_TYPES : int{X509_PUBLIC_KEY_INFO = 8,RSA_CSP_PUBLICKEYBLOB = 19,PKCS_RSA_PRIVATE_KEY = 43,PKCS_PRIVATE_KEY_INFO = 44}/// <summary>Enumeration derived from Crypto API.</summary>internal enum CRYPT_STRING_FLAGS : uint{CRYPT_STRING_BASE64HEADER = 0,CRYPT_STRING_BASE64 = 1,CRYPT_STRING_BINARY = 2,CRYPT_STRING_BASE64REQUESTHEADER = 3,CRYPT_STRING_HEX = 4,CRYPT_STRING_HEXASCII = 5,CRYPT_STRING_BASE64_ANY = 6,CRYPT_STRING_ANY = 7,CRYPT_STRING_HEX_ANY = 8,CRYPT_STRING_BASE64X509CRLHEADER = 9,CRYPT_STRING_HEXADDR = 10,CRYPT_STRING_HEXASCIIADDR = 11,CRYPT_STRING_HEXRAW = 12,CRYPT_STRING_NOCRLF = 0x40000000,CRYPT_STRING_NOCR = 0x80000000}#endregion P/Invoke Constants#region P/Invoke Structures/// <summary>Structure from Crypto API.</summary> [StructLayout(LayoutKind.Sequential)]internal struct CRYPT_OBJID_BLOB{internal UInt32 cbData;internal IntPtr pbData;}/// <summary>Structure from Crypto API.</summary> [StructLayout(LayoutKind.Sequential)]internal struct CRYPT_ALGORITHM_IDENTIFIER{internal IntPtr pszObjId;internal CRYPT_OBJID_BLOB Parameters;}/// <summary>Structure from Crypto API.</summary> [StructLayout(LayoutKind.Sequential)]struct CRYPT_BIT_BLOB{internal UInt32 cbData;internal IntPtr pbData;internal UInt32 cUnusedBits;}/// <summary>Structure from Crypto API.</summary> [StructLayout(LayoutKind.Sequential)]struct CERT_PUBLIC_KEY_INFO{internal CRYPT_ALGORITHM_IDENTIFIER Algorithm;internal CRYPT_BIT_BLOB PublicKey;}#endregion P/Invoke Structures#region P/Invoke Functions/// <summary>Function for Crypto API.</summary>[DllImport("advapi32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptDestroyKey(IntPtr hKey);/// <summary>Function for Crypto API.</summary>[DllImport("advapi32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptImportKey(IntPtr hProv, byte[] pbKeyData, UInt32 dwDataLen, IntPtr hPubKey, UInt32 dwFlags, ref IntPtr hKey);/// <summary>Function for Crypto API.</summary>[DllImport("advapi32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptReleaseContext(IntPtr hProv, Int32 dwFlags);/// <summary>Function for Crypto API.</summary>[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptAcquireContext(ref IntPtr hProv, string pszContainer, string pszProvider, CRYPT_PROVIDER_TYPE dwProvType, CRYPT_ACQUIRE_CONTEXT_FLAGS dwFlags);/// <summary>Function from Crypto API.</summary>[DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptStringToBinary(string sPEM, UInt32 sPEMLength, CRYPT_STRING_FLAGS dwFlags, [Out] byte[] pbBinary, ref UInt32 pcbBinary, out UInt32 pdwSkip, out UInt32 pdwFlags);/// <summary>Function from Crypto API.</summary>[DllImport("crypt32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptDecodeObjectEx(CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, UInt32 cbEncoded, CRYPT_DECODE_FLAGS dwFlags, IntPtr pDecodePara, ref byte[] pvStructInfo, ref UInt32 pcbStructInfo);/// <summary>Function from Crypto API.</summary>[DllImport("crypt32.dll", SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool CryptDecodeObject(CRYPT_ENCODING_FLAGS dwCertEncodingType, IntPtr lpszStructType, byte[] pbEncoded, UInt32 cbEncoded, CRYPT_DECODE_FLAGS flags, [In, Out] byte[] pvStructInfo, ref UInt32 cbStructInfo);#endregion P/Invoke Functions} }

?

原文地址:http://xw-z1985.iteye.com/blog/1929931

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3924807.html

總結(jié)

以上是生活随笔為你收集整理的JAVA/PHP/C#版RSA验签--转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。