0
同時使用rsa提供程序對字符串進行加密和描述時出現此錯誤。RSA數據解密錯誤。要解密的數據超過64字節的這個模數的最大值
RSA數據解密錯誤。要解密的數據超過此模數64字節的最大值。
任何人都有想法如何解決這個錯誤嗎?
internal sealed class RSAProvider { #region key store class [Serializable] private struct rsaKey { public rsaKey(RSAParameters rsaKeyInfo) { D = rsaKeyInfo.D; DP = rsaKeyInfo.DP; DQ = rsaKeyInfo.DQ; Exponent = rsaKeyInfo.Exponent; InverseQ = rsaKeyInfo.InverseQ; Modulus = rsaKeyInfo.Modulus; P = rsaKeyInfo.P; Q = rsaKeyInfo.Q; } public RSAParameters CreateRSAKey() { RSAParameters rsaKeyInfo = new RSAParameters(); rsaKeyInfo.D = D; rsaKeyInfo.DP = DP; rsaKeyInfo.DQ = DQ; rsaKeyInfo.Exponent = Exponent; rsaKeyInfo.InverseQ = InverseQ; rsaKeyInfo.Modulus = Modulus; rsaKeyInfo.P = P; rsaKeyInfo.Q = Q; return rsaKeyInfo; } public byte[] D; public byte[] DP; public byte[] DQ; public byte[] Exponent; public byte[] InverseQ; public byte[] Modulus; public byte[] P; public byte[] Q; } #endregion private static RSAParameters rsaKeyParameters; static RSAProvider() { string rsaKeyString = System.Configuration.ConfigurationSettings.AppSettings["RSAKey"]; if(rsaKeyString != null) { rsaKeyParameters = GetKeyByString(rsaKeyString); } } private RSAProvider() { } private static RSAParameters RSAKeyInfo { get { return rsaKeyParameters; } } private static bool DoOAEPPadding { get { return false; } } public static string GenerateKey(int keySize) { //Create a new instance of RSACryptoServiceProvider to generate //public and private key data. RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(keySize); RSAParameters rsaKeyInfo = RSA.ExportParameters(true); return GetKeyString(rsaKeyInfo); } #region Encrypt public static byte[] Encrypt(byte[] dataToEncrypt, string rsaKeyString) { RSAParameters rsaKeyInfo = GetKeyByString(rsaKeyString); return Encrypt(dataToEncrypt, rsaKeyInfo); } public static byte[] Encrypt(byte[] dataToEncrypt, RSAParameters rsaKeyInfo) { try { //Create a new instance of RSACryptoServiceProvider. // Common.Identity.ImpersonateValidUser("prana", "eetplpvt", "Avdhoota1985"); RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); //Import the RSA Key information. This only needs //toinclude the public key information. RSA.ImportParameters(rsaKeyInfo); //Encrypt the passed byte array and specify OAEP padding. //OAEP padding is only available on Microsoft Windows XP or //later. //return RSA.Encrypt(dataToEncrypt, DoOAEPPadding); byte[] data = RSA.Encrypt(dataToEncrypt, DoOAEPPadding); RSA.Clear(); //Common.Identity.UndoImpersonation(); return data; } //Catch and display a CryptographicException //to the console. catch(CryptographicException e) { // Updated By Divya Bhalodia on 27th June 2008 for Localization task //throw new Exception("Data encryption error.", e); Common.EnumLocalization.EnumLocalization loc = new Common.EnumLocalization.EnumLocalization(ASP.BL.ApplicationUsers.ApplicationUserController.CurrentUserCulture.Code, ASP.BL.Applications.ApplicationController.CurrentApplicationInfo.ItemId); throw new Exception(loc.LocalizeString("RSA Data encryption error.") + e.Message, e); // end Updated - Divya } } public static byte[] Encrypt(byte[] dataToEncrypt) { return Encrypt(dataToEncrypt, RSAKeyInfo); } #endregion #region Decrypt public static byte[] Decrypt(byte[] dataToDecrypt, string rsaKeyString, bool doOAEPPadding) { RSAParameters rsaKeyInfo = GetKeyByString(rsaKeyString); return Decrypt(dataToDecrypt, rsaKeyInfo, doOAEPPadding); } public static byte[] Decrypt(byte[] dataToDecrypt, RSAParameters rsaKeyInfo, bool doOAEPPadding) { try { //Create a new instance of RSACryptoServiceProvider. Common.Identity.ImpersonateValidUser(); RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); //Import the RSA Key information. This needs //to include the private key information. RSA.ImportParameters(rsaKeyInfo); //Decrypt the passed byte array and specify OAEP padding. //OAEP padding is only available on Microsoft Windows XP or //later. //return RSA.Decrypt(dataToDecrypt, doOAEPPadding); byte[] data = RSA.Decrypt(dataToDecrypt, doOAEPPadding); RSA.Clear(); Common.Identity.UndoImpersonation(); return data; } //Catch and display a CryptographicException //to the console. catch(CryptographicException e) { // Updated By Divya Bhalodia on 27th June 2008 for Localization task //throw new Exception("Data decryption error.", e); Common.EnumLocalization.EnumLocalization loc = new Common.EnumLocalization.EnumLocalization(ASP.BL.ApplicationUsers.ApplicationUserController.CurrentUserCulture.Code, ASP.BL.Applications.ApplicationController.CurrentApplicationInfo.ItemId); throw new Exception(loc.LocalizeString("RSA Data decryption error.") + e.Message, e); // end Updated - Divya } } public static byte[] Decrypt(byte[] dataToDecrypt) { return Decrypt(dataToDecrypt, RSAKeyInfo, DoOAEPPadding); } #endregion #region Additional functions private static string GetKeyString(RSAParameters rsaKeyInfo) { byte[] tmp; rsaKey k = new rsaKey(rsaKeyInfo); BinaryFormatter formater = new BinaryFormatter(); using(MemoryStream stream = new MemoryStream()) { formater.Serialize(stream, k); tmp = stream.ToArray(); } Code(tmp); return Convert.ToBase64String(tmp); } private static RSAParameters GetKeyByString(string rsaKeyString) { rsaKey k; byte[] tmp = Convert.FromBase64String(rsaKeyString); Code(tmp); BinaryFormatter formater = new BinaryFormatter(); using(MemoryStream stream = new MemoryStream(tmp)) { k = (rsaKey)formater.Deserialize(stream); } return k.CreateRSAKey(); } private static void Code(byte[] tmp) { byte mask1 = 0x55; byte mask3 = 0xB9; byte mask4 = 0xCF; for(int i = 0; i
它意味着它說什麼。您嘗試解密的數據已損壞,或者您提供的設置不正確。發佈代碼以獲取更多幫助。 – 2009-05-20 10:22:45