我有4個字節的數據,需要一個8字節的陣列進行安全操作。我應該從4字節的字節數組中產生這8個字節,這應該是可重複的。如何使用可重現的操作從4個字節產生8個字節?
我正在考慮使用精確的字節數組並添加4個額外的字節,並用已知序列中的AND,OR,XOR ...來填充初始數組。我不確定這是個好主意。我只需要從這4個字節中獲得一個8字節的數組,並且操作應該是可重複的(同樣的8個字節給定4個字節)。請在C#中給出一個示例:
我有4個字節的數據,需要一個8字節的陣列進行安全操作。我應該從4字節的字節數組中產生這8個字節,這應該是可重複的。如何使用可重現的操作從4個字節產生8個字節?
我正在考慮使用精確的字節數組並添加4個額外的字節,並用已知序列中的AND,OR,XOR ...來填充初始數組。我不確定這是個好主意。我只需要從這4個字節中獲得一個8字節的數組,並且操作應該是可重複的(同樣的8個字節給定4個字節)。請在C#中給出一個示例:
爲什麼不用現有的4個字節填充另外4個字節的零?或重複原始的4個字節。例如:
static byte[] Pad(byte[] input)
{
// Alternatively use Array.Resize
byte[] output = new byte[input.Length + 4];
Buffer.BlockCopy(input, 0, output, 0, input.Length);
return output;
}
static byte[] Repeat(byte[] input)
{
byte[] output = new byte[input.Length * 2];
Buffer.BlockCopy(input, 0, output, 0, input.Length);
Buffer.BlockCopy(input, 0, output, input.Length, input.Length);
return output;
}
這些都符合您的原始標準,我相信......但我懷疑您正在尋找別的東西。如果是這樣的話,你需要明確你需要什麼。
編輯:正如我在評論中所說,你基本上沒有在這裏添加任何真正的安全 - 填充將使更清晰,國際海事組織。另一方面,如果做需要一些安全隱患,你可以找到一個隨機數發生器,允許播種,並以此爲起點。例如:現在
// Don't use this - see below. Just the concept...
int seed = BitConverter.ToInt32(input, 0); // TODO: Cope with endianness
Random rng = new Random(seed);
byte[] output = new byte[8];
Buffer.BlockCopy(input, 0, output, 0, 4);
for (int i = 4; i < 8; i++) {
output[i] = (byte) rng.Next(256);
}
,我已經得到了上述評論的原因是,你可能需要它保證不會.NET的版本之間改變的算法。找到像梅森扭轉者的代碼,例如。
有多種方法可以爲分組密碼填充填充。
此Wikipedia文章講述了一些比較認可的解決方案:http://en.wikipedia.org/wiki/Padding_(cryptography)#Padding_methods
除非任何其他方面的考慮,我會用PKCS#7填充。
如何
bytes.Concat(bytes)
我會非常小心。如果安全操作需要64位數據,那可能是因爲它需要那麼多數據。如果使用已知的可重複公式從32位創建64位,則只能獲得32位數據。
如果安全性不受數據影響,您只需填寫餘下的四個字節爲1或零。但是你應該真的嘗試獲得8個字節的「真實」數據。
我同意但項目限制迫使我這樣做(至少對我來說這是一個動態解決方案),而不是在我的代碼中硬編碼一個8字節的數組。實際上4個字節就夠了,但我對此有點悲觀。 – Xaqron 2010-11-19 08:43:32
我不知道我是否在這裏錯過了這一點,但最好的辦法就是填充4個空字節?這是有效的和可重複的。 – 2010-11-19 08:32:52
很多方法可以做到這一點....只需複製它兩次,填充0,複製和反轉,哈希,...甚至可以混合順序,所以它並不總是最後或前4個重要的字節。 – mpen 2010-11-19 08:35:44
是否需要在big-endian系統上工作的代碼? – CodesInChaos 2010-11-19 09:13:25