データベース行のセットをエクスポートするプログラムがあります。行内には、暗号化する必要があるデータがあります。データを暗号化できますが、復号化できないようです。非対称キーの Windows フォームと Windows サービスを使用した Xml ファイルの復号化 に示されているコーディングに従いましたが、「復号化キーを取得できません」というメッセージが引き続き表示されます。
現在、これは同じユーザーの同じマシンで行われていますが、常にそうであるとは限りません。エクスポートされたファイルは別のマシンに移動され、別のユーザーでインポートされます。
これが私の暗号化ルーチンです...
XmlElement elementToEncrypt;
var security = new CryptoKeySecurity();
// Give the creating user full access
security.AddAccessRule(new CryptoKeyAccessRule(new NTAccount(Environment.UserDomainName, Environment.UserName),
CryptoKeyRights.FullControl, AccessControlType.Allow));
// Specify that the key is to be stored in the machine key-store, and apply the security settings created above
var cspParams = new CspParameters
{
KeyContainerName = "XML_ENC_RSA_KEY",
Flags = CspProviderFlags.UseMachineKeyStore,
CryptoKeySecurity = security
};
var rsaKey = new RSACryptoServiceProvider(cspParams);
elementToEncrypt = xmlDocument.GetElementsByTagName(elementName)[0] as XmlElement;
var sessionKey = new RijndaelManaged() { KeySize = 256 };
EncryptedXml eXml = new EncryptedXml();
byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false);
var edElement = new EncryptedData()
{
Type = EncryptedXml.XmlEncElementUrl,
Id = elementName,
EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url)
};
var ek = new EncryptedKey();
var encryptedKey = EncryptedXml.EncryptKey(sessionKey.Key, rsaKey, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
// Create a new KeyInfoName element.
var kin = new KeyInfoName() { Value = elementName };
// Add the KeyInfoName element to the encryptedKey object.
ek.KeyInfo.AddClause(kin);
edElement.CipherData.CipherValue = encryptedElement;
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
これが私の復号化ルーチンです....
var cspParams = new CspParameters
{
KeyContainerName = "XML_ENC_RSA_KEY",
Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.UseExistingKey
};
var rsaKey = new RSACryptoServiceProvider(cspParams);
var exml = new EncryptedXml(xmlDocument);
exml.AddKeyNameMapping(elementName, rsaKey);
exml.DecryptDocument();
助けてくれてありがとう!!!
ゲイリー