public static byte[] RepeatingKeyXor(byte[] key, byte[] source) { if (key == null) { throw new ArgumentNullException("key"); } if (source == null) { throw new ArgumentNullException("source"); } var keyLength = key.Length; var result = new byte[source.Length]; using (var sourceMs = new MemoryStream(source)) { using (var destinationMs = new MemoryStream(result)) { var buffer = new byte[keyLength]; int read; while ((read = sourceMs.Read(buffer, 0, buffer.Length)) > 0) { byte[] keyBytesToUse; byte[] bufferToUse; if (read != keyLength) { keyBytesToUse = new byte[read]; Array.Copy(key, keyBytesToUse, read); bufferToUse = new byte[read]; Array.Copy(buffer, bufferToUse, read); } else { keyBytesToUse = key; bufferToUse = buffer; } var currentChunk = Challenge2.Xor(keyBytesToUse, bufferToUse); destinationMs.Write(currentChunk, 0, read); } } } return(result); }
public static int HammingDistance(byte[] valueA, byte[] valueB) { if (valueA == null) { throw new ArgumentNullException("valueA"); } if (valueB == null) { throw new ArgumentNullException("valueB"); } if (valueA.Length != valueB.Length) { throw new ArgumentOutOfRangeException("valueA", "Both values must be the same length."); } var xorValue = Challenge2.Xor(valueA, valueB); return(xorValue.Sum(x => SetBitCountMap[x])); }