C#での通常のDES暗号化に問題があります。アルファベットと数字のみを含む、16文字の長さ(16バイト128ビット)の出力文字列が必要です。
1284 次
1 に答える
1
英数字のみで構成される16文字の出力に制限されている場合は、最大95ビットの出力スペースを使用できることを意味します(Base-64エンコーディングを使用できる場合は正確に96ビット、つまり2文字の英数字以外の文字を含めることができます)。
したがって、この制限で95ビットを超える暗号化を行うことはできません。これで十分な場合は可能です。
このようなもの(CTRモードの3DES)は、(Base-64を使用して)どのように機能するかの一例ですが、上記のコメントで述べたように、実際に何をしようとしているかによって異なります。
void Main()
{
var data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
var key = new byte[] { 01, 12, 23, 34, 45, 56, 67, 78, 89, 90, 09, 98, 87, 76, 65, 54, 43, 32, 21, 10, 11, 22, 33, 44 };
var encrypted = Encrypt(data, key, 0);
Console.WriteLine(encrypted);
var decrypted = Decrypt(encrypted, key, 0);
// decrypted should be equal to data here
}
public string Encrypt(byte[] data, byte[] key, long nonce)
{
return Convert.ToBase64String(Transform(data, key, nonce));
}
public byte[] Decrypt(string data, byte[] key, long nonce)
{
return Transform(Convert.FromBase64String(data), key, nonce);
}
byte[] Transform(byte[] data, byte[] key, long nonce)
{
if (data.Length > 96/8) throw new ArgumentException("Too much data");
using (var des = new TripleDESCryptoServiceProvider())
{
des.Key = key;
des.Mode = CipherMode.ECB;
using (var encryptor = des.CreateEncryptor())
{
var output = new byte[data.Length];
var offset = 0;
for(int counter = 0; counter <= data.Length / 8; ++counter)
{
var counterData = BitConverter.GetBytes(((long)counter) ^ nonce);
var counterEncryption = new byte[des.BlockSize / 8];
var counterEncryptionLen = encryptor.TransformBlock(counterData, 0, counterData.Length, counterEncryption, 0);
Debug.Assert(counterEncryptionLen == counterEncryption.Length);
for (var i = 0; i < des.BlockSize / 8 && offset < output.Length; ++i, ++offset)
{
output[offset] = (byte)(data[offset] ^ counterEncryption[i]);
}
}
return output;
}
}
}
于 2012-05-10T18:21:14.790 に答える