के माध्यम से अनोखा सार्वजनिक और निजी कुंजी कैसे उत्पन्न करें मैं एक कस्टम शॉपिंग कार्ट का निर्माण कर रहा हूं जहां सीसी संख्या और एक्सप तिथि डाटाबेस में प्रोसेसिंग (तब हटाई गई) तक संग्रहीत की जाएगी। मुझे इस डेटा को एन्क्रिप्ट करना होगा (जाहिर है)।आरएसए
मैं RSACryptoServiceProvider क्लास का उपयोग करना चाहता हूं।
मेरी चाबियाँ बनाने के लिए मेरा कोड यहां है।
public static void AssignNewKey(){
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "KeyContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
rsa = new RSACryptoServiceProvider(cspParams);
string publicPrivateKeyXML = rsa.ToXmlString(true);
string publicOnlyKeyXML = rsa.ToXmlString(false);
// do stuff with keys...
}
अब योजना निजी कुंजी एक्सएमएल को प्रबंधकों की कुंजी श्रृंखला से जुड़े यूएसबी ड्राइव पर स्टोर करना है।
जब भी कोई प्रबंधक कंपनी छोड़ देता है, तो मैं नई सार्वजनिक और निजी कुंजी उत्पन्न करने में सक्षम होना चाहता हूं (और सभी सार्वजनिक रूप से संग्रहीत सीसी संख्याओं को नई सार्वजनिक कुंजी के साथ फिर से एन्क्रिप्ट करें)।
मेरी समस्या यह है कि इस कोड द्वारा उत्पन्न कुंजी हमेशा एक ही होती है। मैं हर बार चाबियों का एक अद्वितीय सेट कैसे उत्पन्न करूं?
अद्यतन। मेरा टेस्ट कोड नीचे है .:
नोट: यहां "निजीकी" पैरामीटर मूल निजी कुंजी है। कुंजी बदलने के लिए मुझे यह सत्यापित करने की आवश्यकता है कि निजी कुंजी मान्य है।
Default.aspx.cs
public void DownloadNewPrivateKey_Click(object sender, EventArgs e)
{
StreamReader reader = new StreamReader(fileUpload.FileContent);
string privateKey = reader.ReadToEnd();
Response.Clear();
Response.ContentType = "text/xml";
Response.End();
Response.Write(ChangeKeysAndReturnNewPrivateKey(privateKey));
}
में Crytpography.cs में:
public static privateKey;
public static publicKey;
public static RSACryptoServiceProvider rsa;
public static string ChangeKeysAndReturnNewPrivateKey(string _privatekey)
{
string testData = "TestData";
string testSalt = "salt";
// encrypt the test data using the exisiting public key...
string encryptedTestData = EncryptData(testData, testSalt);
try
{
// try to decrypt the test data using the _privatekey provided by user...
string decryptTestData = DecryptData(encryptedTestData, _privatekey, testSalt);
// if the data is successfully decrypted assign new keys...
if (decryptTestData == testData)
{
AssignNewKey();
// "AssignNewKey()" should set "privateKey" to the newly created private key...
return privateKey;
}
else
{
return string.Empty;
}
}
catch (Exception ex)
{
return string.Empty;
}
}
public static void AssignParameter(){
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "KeyContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
rsa = new RSACryptoServiceProvider(cspParams);
}
public static void AssignNewKey()
{
AssignParameter();
using (SqlConnection myConn = new SqlConnection(Utilities.ConnectionString))
{
SqlCommand myCmd = myConn.CreateCommand();
string publicPrivateKeyXML = rsa.ToXmlString(true);
privateKey = publicPrivateKeyXML; // sets the public variable privateKey to the new private key.
string publicOnlyKeyXML = rsa.ToXmlString(false);
publicKey = publicOnlyKeyXML; // sets the public variable publicKey to the new public key.
myCmd.CommandText = "UPDATE Settings SET PublicKey = @PublicKey";
myCmd.Parameters.AddWithValue("@PublicKey", publicOnlyKeyXML);
myConn.Open();
myComm.ExecuteScalar();
}
}
public static string EncryptData(string data2Encrypt, string salt)
{
AssignParameter();
using (SqlConnection myConn = new SqlConnection(Utilities.ConnectionString))
{
SqlCommand myCmd = myConn.CreateCommand();
myCmd.CommandText = "SELECT TOP 1 PublicKey FROM Settings";
myConn.Open();
using (SqlDataReader sdr = myCmd.ExecuteReader())
{
if (sdr.HasRows)
{
DataTable dt = new DataTable();
dt.Load(sdr);
rsa.FromXmlString(dt.Rows[0]["PublicKey"].ToString());
}
}
}
//read plaintext, encrypt it to ciphertext
byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt + salt);
byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
return Convert.ToBase64String(cipherbytes);
}
public static string DecryptData(string data2Decrypt, string privatekey, string salt)
{
AssignParameter();
byte[] getpassword = Convert.FromBase64String(data2Decrypt);
string publicPrivateKeyXML = privatekey;
rsa.FromXmlString(publicPrivateKeyXML);
//read ciphertext, decrypt it to plaintext
byte[] plain = rsa.Decrypt(getpassword, false);
string dataAndSalt = System.Text.Encoding.UTF8.GetString(plain);
return dataAndSalt.Substring(0, dataAndSalt.Length - salt.Length);
}
आप इसका परीक्षण कैसे कर रहे हैं? –
मैं मूल रूप से एक .NET पृष्ठ से AssignNewKey() फ़ंक्शन को कॉल कर रहा हूं और फिर अपने पिछले संस्करण के विरुद्ध नया "publicPrivateKeyXML" देख रहा हूं। मैं अपना टेस्ट कोड शामिल करने के लिए ऊपर दिए गए प्रश्न को अपडेट करूंगा। –
यह थोड़ा टेंगेंशियल है, लेकिन क्या आपको एहसास है कि क्रेडिट कार्ड नंबरों को स्टोर करने के लिए आपको अपने सिस्टम को पीसीआई अनुपालन की आवश्यकता है? Http://stackoverflow.com/questions/4300863/storing-credit-card-number-pci – Art