0
string keyName = "c94a1e1f-177c-460a-8a34-bf1a3da300a2";
        string valueToDecrypt = "GvI5sh1P3a30iX6vkfolier/rHFEDpfVhXngxp12AoUXgfCxkvICugNcvZ9yZLIrTJcsS3clyp8iA7ByRkxYvb1oYOzGznFYkKfWE/4mtarUdlyrLYX8ubYMEGeDfUIhisXGTkRe9ewr7QoNt4wJ8Avu+mRjTonPwzDGTE3f2CQ=";

    string retVal = String.Empty;
    RSACryptoServiceProvider rsa = null;
    try
    {
        if (!String.IsNullOrEmpty(keyName))
        {
            byte[] bDecryptedValue = Convert.FromBase64String(valueToDecrypt);
           // Array.Reverse(bDecryptedValue);

            //byte[] bDecryptedValue = Encoding.UTF8.GetBytes(valueToDecrypt);        

            CspParameters cp = new CspParameters() { KeyContainerName = keyName, Flags = CspProviderFlags.UseExistingKey};              

            rsa = new RSACryptoServiceProvider(cp);
            Console.WriteLine("RSE Object created");
            byte[] byteNumber = rsa.Decrypt(bDecryptedValue, false);
            retVal = ASCIIEncoding.ASCII.GetString(byteNumber);
        }
    }

このコードを WCF アプリケーションで使用すると、正しく機能しました。しかし、コンソールアプリケーションで同じコードを使用したとき。Bad data例外は次の行からスローされます:

byte[] byteNumber = rsa.Decrypt(bDecryptedValue, false);

復号化する前にバイト配列を逆にしてみましたが、それもうまくいきませんでした。IIS ではアプリケーション プールが "NetworkService" ID で実行されていたため、Crypto key セキュリティ アクセス ルールも作成してみました。

CryptoKeySecurity cks = new CryptoKeySecurity();
var si = new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null);
var sec = new System.Security.AccessControl.CryptoKeyAccessRule(si, CryptoKeyRights.GenericAll, AccessControlType.Allow);
cks.AddAccessRule(sec);
cp.CryptoKeySecurity = cks;

理由は何ですか?

WCF サービスで使用されるコードは

public string Decrypt(string keyName, string valueToDecrypt)
        {
            string retVal = String.Empty;
            RSACryptoServiceProvider rsa = null;
            try
            {
                if (!String.IsNullOrEmpty(keyName))
                {
                    byte[] bDecryptedValue = Convert.FromBase64String(valueToDecrypt);
                    CspParameters cp = new CspParameters() { KeyContainerName = keyName, Flags = CspProviderFlags.UseExistingKey };

                    Console.WriteLine("Reached initialization");

                    rsa = new RSACryptoServiceProvider(cp);
                    byte[] byteNumber = rsa.Decrypt(bDecryptedValue, false);
                    retVal = ASCIIEncoding.ASCII.GetString(byteNumber);
                }
            }

            catch (Exception ex)
            {
                retVal = ex.Message;
            }
            finally
            {
                if (rsa != null)
                {
                    rsa.Dispose();
                }
            }

            return retVal;
        }

暗号化に使用される関数は、

 string Encrypt(string valueToEncrypt)
        {
            string retVal = String.Empty;
            RSACryptoServiceProvider rsa = null;
            try
            {
                Key currentKey = GetActiveCryptoKey();
          // while running the Kay name is "c94a1e1f-177c-460a-8a34-bf1a3da300a2"
                if ((currentKey != null) && (!String.IsNullOrEmpty(currentKey.KeyName)))
                {
                    byte[] bDecryptedValue = ASCIIEncoding.ASCII.GetBytes(valueToEncrypt);
                    CspParameters cp = new CspParameters() { KeyContainerName = currentKey.KeyName, Flags = CspProviderFlags.UseExistingKey};
                    rsa = new RSACryptoServiceProvider(cp);
                    byte[] byteNumber = rsa.Encrypt(bDecryptedValue, false);
                    retVal = Convert.ToBase64String(byteNumber);
                }
            }
            catch (FaultException fex)
            {
                throw new FaultException<ServiceFault>(new ServiceFault(fex), fex.Message);
            }
            catch (Exception ex)
            {

                LogException(ex);

            }
            finally
            {
                if (rsa != null)
                {
                    rsa.Dispose();
                }
            }

            return retVal;
        }
4

0 に答える 0