-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCrackTests.fs
166 lines (132 loc) · 5.13 KB
/
CrackTests.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
module CrackTests
open NUnit.Framework
open FsUnit
open Crack
open Ascii
open System
[<Test>]
let ``Hamming distance of two zeros should be zero``() =
hammingDist [0uy] [0uy]
|> should equal 0
[<Test>]
let ``Hamming distance of 0 and 1 should be 1``() =
hammingDist [0uy] [1uy]
|> should equal 1
[<Test>]
let ``Hamming distance of 1011101 and 1001001 should be 2``() =
hammingDist [0b1011101uy] [0b1001001uy]
|> should equal 2
[<Test>]
let ``Hamming distance of "this is a test" and "wokka wokka!!!" should be 37``() =
hammingDist (asciiToBytes "this is a test") (asciiToBytes "wokka wokka!!!")
|> should equal 37
[<Test>]
let ``Average hamming distances 2``() =
let sqs = [
[|0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy|];
[|0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy|]
]
avgHammingDistances sqs
|> should equal (Seq.ofList [2])
[<Test>]
let ``Average hamming distances of 0, 1 and 2 should be 1, 2``() =
avgHammingDistances [ [|0uy|]; [|1uy|]; [|2uy|] ]
|> should equal (Seq.ofList [1; 2])
[<Test>]
let ``Average sampled hamming distances of [0;1;2] should be 1 for chunkSize 1, groupCount 3, sampleCount 1``() =
avgSampledHammingDistances 1 3 1 [0uy; 1uy; 2uy]
|> should equal 1
[<Test>]
let ``Average sampled hamming distances of [0;0;0] should be 0 for chunkSize 1, groupCount 3, sampleCount 1``() =
avgSampledHammingDistances 1 3 1 [0uy; 0uy; 0uy]
|> should equal 0
[<Test>]
let ``Average sampled hamming distances of [0; 0; 0; 0; 0; 0] should be 0 for chunkSize 2, groupCount 3, sampleCount 1``() =
avgSampledHammingDistances 2 3 1 [0uy; 0uy; 0uy; 0uy; 0uy; 0uy;]
|> should equal 0
[<Test>]
let ``Average sampled hamming distances 1``() =
let data = [
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy
]
avgSampledHammingDistances 4 2 1 data
|> should equal 2
[<Test>]
let ``Average sampled hamming distances 2``() =
let data = [
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy
]
avgSampledHammingDistances 8 2 1 data
|> should equal 2
[<Test>]
let ``Average sampled hamming distances 3``() =
let data = [
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy
]
avgSampledHammingDistances 4 2 2 data
|> should equal 2
[<Test>]
let ``Average sampled hamming distances 4``() =
let data = [
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy // 0
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy // 2
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy // 0
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy // 2
]
avgSampledHammingDistances 2 2 4 data
|> should equal 1
[<Test>]
let ``Average sampled hamming distances 5``() =
let data = [
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy // 0
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy // 2
0b00000000uy; 0b00000000uy; 0b00000000uy; 0b00000000uy // 0
0b00010000uy; 0b00010000uy; 0b10000100uy; 0b10010110uy // 2
]
avgSampledHammingDistances 2 4 2 data
|> should equal 1
[<Test>]
let ``Guess key length with depth 2 and samplesize 2``() =
let original = asciiToBytes "This is the text that will be xor encrypted!!!!!!!"
let key = [|23uy;01uy;143uy;97uy;201uy|]
let encrypted = Xor.xor key original
guesKeyLength key.Length 2 5 encrypted
|> should equal key.Length
[<Test>]
let ``Crack xored singlebyte key``() =
let original = asciiToBytes "This is the text that will be xor encrypted!!!!!!!"
let key = [23uy]
let encrypted = Xor.xor key original
let (guessedKey, score) = guessRepeatedXorKey 1 encrypted
let text = Xor.xor guessedKey encrypted |> bytesToAscii
printfn "%s" (String.Concat text)
guessedKey |> should equal key
[<Test>]
let ``Crack xored multibyte key``() =
let originalText = "This is the text that will be xor encrypted!!!!!!!"
let original = asciiToBytes originalText
//let key = [|23uy;01uy;143uy;97uy;201uy|]
let key = [|23uy;45uy|]
let encrypted = Xor.xor key original
let guesses = guessRepeatedXorKeys key.Length 2 encrypted
guesses
|> Seq.iter (fun (guessedKey, (text, score)) -> printfn "Score %i, key%A: %s" score guessedKey text)
guesses
|> Seq.exists (fun (_, (text, _)) -> String.Equals(text, originalText))
|> should equal true
//guessedKey |> should equal key
[<Test>]
let ``keys 1``() =
let allKeys = List.ofSeq (keys 1)
allKeys.Length |> should equal 256
[<Test>]
let ``keys 2``() =
let allKeys = List.ofSeq (keys 2)
allKeys.Length |> should equal (256 * 256)