2012-05-07 49 views
-3

我在C#中的正常DES加密存在問題,我想要一個輸出字符串,它具有16個字符長度(16字節的128位),它只包含字母和數字字符。128位輸出的DES加密

+1

輸出長度是輸入長度和填充方案的函數。然後,您可以用任何適當的方案對輸出進行編碼,但是如果您的最終字母表是字母數字,那麼您將不得不應對一些擴展。 –

+0

你的輸入多長時間,以字節爲單位?正如@GregS所說的,你總是可以將輸出編碼爲十六進制,Base-32或Base-64,但總是會超過你編碼的字節數。這也將有助於知道爲什麼你需要輸出這個長度和這種格式。 – rossum

回答

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; 
     } 
    } 
} 
+0

謝謝@mormegil。這真的很有幫助。 – Prime