2

C# 内で文字列の単純なコーディングとデコードを実装する必要があります。

「高度な秘密」暗号化は必要ないので、チェックサムを取得するとすぐに単純なエンコーディングで問題ありません。

コードの 1 つのインスタンス内で簡単な双方向のエンコード/デコードが必要です。エンコードとデコードの両方を行うプログラムは 1 つしかないため、任意の「秘密鍵」をハードコーディングできます。

エンコードの結果は英数字 (テキスト) である必要があります。フィールドはテキスト CSV テーブルであるファイルに含まれるため、バイナリ データ (非文字、非数字) は避ける必要があります。

一貫性をチェックできるコードを取得する必要があるため (制御桁/チェックサムを含める必要があります)、フィールドがサードパーティによって変更されておらず、有効にデコード可能であることがわかります。(クレジット カード番号内の制御桁のようなもの)。

codelength は、生の文字列の長さとほぼ同じにする必要があります (5 ~ 10 倍ではありません)。

C# 内で最適なライブラリを教えていただければ幸いです。よろしくお願いします。

4

2 に答える 2

1

このコードを使用して、rijndael での暗号化/復号化を行いました。暗号化された文字列に触れると、CryptographicException がスローされます。

http://www.codeproject.com/Articles/5719/Simple-encrypting-and-decrypting-data-in-Cのメソッド

public string Encrypt(string clearText, string Password)
    {
        //Convert text to bytes
        byte[] clearBytes =
          System.Text.Encoding.Unicode.GetBytes(clearText);

        //We will derieve our Key and Vectore based on following 
        //password and a random salt value, 13 bytes in size.
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
            new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 
        0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76});

        byte[] encryptedData = Encrypt(clearBytes,
                 pdb.GetBytes(32), pdb.GetBytes(16));

        return Convert.ToBase64String(encryptedData);
    }

    //Call following function to decrypt data
    public string Decrypt(string cipherText, string Password)
    {
        //Convert base 64 text to bytes
        byte[] cipherBytes = Convert.FromBase64String(cipherText);

        //We will derieve our Key and Vectore based on following 
        //password and a random salt value, 13 bytes in size.
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
            new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 
        0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
        byte[] decryptedData = Decrypt(cipherBytes,
            pdb.GetBytes(32), pdb.GetBytes(16));

        //Converting unicode string from decrypted data
        return Encoding.Unicode.GetString(decryptedData);
    }

    public byte[] Encrypt(byte[] clearData, byte[] Key, byte[] IV)
    {
        byte[] encryptedData;
        //Create stream for encryption
        using (MemoryStream ms = new MemoryStream())
        {
            //Create Rijndael object with key and vector
            using (Rijndael alg = Rijndael.Create())
            {
                alg.Key = Key;
                alg.IV = IV;
                //Forming cryptostream to link with data stream.
                using (CryptoStream cs = new CryptoStream(ms,
                   alg.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    //Write all data to stream.
                    cs.Write(clearData, 0, clearData.Length);
                }
                encryptedData = ms.ToArray();
            }
        }
        return encryptedData;
    }

    public byte[] Decrypt(byte[] cipherData, byte[] Key, byte[] IV)
    {
        byte[] decryptedData;
        //Create stream for decryption
        using (MemoryStream ms = new MemoryStream())
        {
            //Create Rijndael object with key and vector
            using (Rijndael alg = Rijndael.Create())
            {
                alg.Key = Key;
                alg.IV = IV;
                //Forming cryptostream to link with data stream.
                using (CryptoStream cs = new CryptoStream(ms,
                    alg.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    //Write all data to stream.
                    cs.Write(cipherData, 0, cipherData.Length);
                }
                decryptedData = ms.ToArray();
            }
        }
        return decryptedData;
    }
于 2012-11-21T10:13:24.833 に答える