मैं बेतरतीब ढंग से इस अपवाद को एनक्रिप्ट/Xamarin.Android साथ तार decrypting लेकिन दुर्भाग्य से मैं इसे पुन: पेश नहीं कर सकता से संबंधित रिपोर्ट उत्पादन उपयोगकर्ताओं का एक छोटा सा प्रतिशत देख रहा हूँ।CryptographicException: खराब PKCS7 गद्दी
इस कारण बन सकता है क्या और/या कैसे मैं अपवाद पुन: पेश सकता है, ताकि मैं एक फिक्स/वैकल्पिक हल पता लगा सकते हैं?
[CryptographicException: Bad PKCS7 padding. Invalid length 147.]
Mono.Security.Cryptography.SymmetricTransform.ThrowBadPaddingException(PaddingMode padding, Int32 length, Int32 position):0
Mono.Security.Cryptography.SymmetricTransform.FinalDecrypt(System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount):0
Mono.Security.Cryptography.SymmetricTransform.TransformFinalBlock(System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount):0
System.Security.Cryptography.CryptoStream.FlushFinalBlock():0
com.abc.mobile.shared.Security+PasswordEncoder.DecryptWithByteArray(System.String strText, System.String strEncrypt):0
संपादित करें: यहाँ कोड मैं एन्क्रिप्ट करने के लिए उपयोग कर रहा हूँ है/डिक्रिप्ट
private string EncryptWithByteArray(string inPassword, string inByteArray)
{
byte[] tmpKey = new byte[20];
tmpKey = System.Text.Encoding.UTF8.GetBytes(inByteArray.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputArray = System.Text.Encoding.UTF8.GetBytes(inPassword);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(tmpKey, mInitializationVector), CryptoStreamMode.Write);
cs.Write(inputArray, 0, inputArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
private string DecryptWithByteArray (string strText, string strEncrypt)
{
try
{
byte[] tmpKey = new byte[20];
tmpKey = System.Text.Encoding.UTF8.GetBytes (strEncrypt.Substring (0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
Byte[] inputByteArray = Convert.FromBase64String (strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream (ms, des.CreateDecryptor (tmpKey, mInitializationVector), CryptoStreamMode.Write);
cs.Write (inputByteArray, 0, inputByteArray.Length);
try {
cs.FlushFinalBlock();
} catch (Exception ex) {
throw(ex);
}
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
return encoding.GetString(ms.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}
संपादित करें 2:
एन्क्रिप्शन कुंजी हमेशा स्थानीय डिवाइस आईडी है। यहाँ मैं यह कैसे हो रही है है:
TelephonyManager telephonyMgr = Application.Context.GetSystemService(Context.TelephonyService) as TelephonyManager;
string deviceId = telephonyMgr.DeviceId == null ? "UNAVAILABLE" : telephonyMgr.DeviceId;
यह इस प्रकार से कहा जाता है की एक उदाहरण है:
string mByteArray = GetDeviceId();
string mEncryptedString = EncryptWithByteArray(stringToEncrypt, mByteArray);
string mDecryptedString = DecryptWithByteArray(mEncryptedString, mByteArray);
क्या ब्लॉक सिफर और ऑपरेशन मोड? क्या आप उस संदेश की एक प्रति प्रदान कर सकते हैं जो डिक्रिप्ट करने में विफल रहा? 147 एक अजीब लंबाई की तरह लगता है। यह * आमतौर पर * ब्लॉक सिफर की ब्लॉक लंबाई (अक्सर 16) का एक बहु होना चाहिए। हालांकि, सीटीएस और सीटीआर जैसे मोड में यह आवश्यकता नहीं है। सीबीसी जैसे मोड को मानते हुए, यह लगभग एक अधूरा संदेश संसाधित होने जैसा लगता है। – jww
मैंने अपने मूल सत्यापन में कोड जोड़ा =) –
आपके संपादन के आधार पर और डीईएस का उपयोग कर कोड, 147 *** *** गलत है। डीईएस का ब्लॉक आकार 8 बाइट्स है, इसलिए संदेश 8 बाइट्स का एक बहु होना चाहिए। गायब 3 बाइट्स खोजें (यह 152 बाइट होना चाहिए), और आपकी समस्या हल हो गई है। साथ ही, आपको एन्क्रिप्टेड डेटा के लिए 'बाइट []', 'स्ट्रिंग' नहीं, का उपयोग करना चाहिए। एन्क्रिप्टेड डेटा में 0x00 बाइट शामिल हो सकता है, जो समस्याएं पैदा कर सकता है। या बेस 64 डेटा ताकि यह नल बाइट्स को संभाल सके। – jww