1

データベース行のセットをエクスポートするプログラムがあります。行内には、暗号化する必要があるデータがあります。データを暗号化できますが、復号化できないようです。非対称キーの 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(); 

助けてくれてありがとう!!!

ゲイリー

4

0 に答える 0