-
Notifications
You must be signed in to change notification settings - Fork 0
/
set2_challenge12.go
104 lines (79 loc) · 2.59 KB
/
set2_challenge12.go
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
package main
import (
"crypto/aes"
"encoding/base64"
"strings"
)
func buildString(lenght int) string {
return strings.Repeat("A", lenght)
}
func encrypt(message, key []byte) []byte {
block, err := aes.NewCipher(key)
if err != nil {
panic("cannot create cipher")
}
buffer := AddPaddingToBlock(message, len(key))
result := make([]byte, len(buffer))
EncryptAES128ECB(block, result, buffer)
return result
}
func findKeySize(secretMessageAsBase64, key []byte) int {
originalLeght := len(encrypt(secretMessageAsBase64, key))
for i := 0; i < 100; i++ {
lenghtForI := len(encrypt([]byte(string(secretMessageAsBase64)+buildString(i)), key))
if lenghtForI > originalLeght {
return lenghtForI - originalLeght
}
}
panic("cannot found key size")
}
func compeare(firstBlock, secondBlock []byte, blockSize int) bool {
for i := 0; i < blockSize; i++ {
if firstBlock[i] != secondBlock[i] {
return false
}
}
return true
}
func findLetterForBlock(mask string, block, key []byte) rune {
compeareSize := len(mask)
for letter := rune(0); letter <= 255; letter++ {
blockForLetter := encrypt([]byte(mask+string(letter)), key)
if compeare(block, blockForLetter, compeareSize) {
return letter
}
}
panic("coudn't find the letter")
}
func byteAtTimeDecryption(secretMessage, key []byte, blockSize int) string {
result := strings.Builder{}
for {
for index := 1; index <= blockSize; index++ {
prefixPadding := buildString(blockSize - index)
currentBase := prefixPadding + result.String()
encryptedMessage := encrypt([]byte(prefixPadding+string(secretMessage)), key)
letter := findLetterForBlock(currentBase, encryptedMessage, key)
if result.Len() == len(secretMessage) {
return result.String()
}
result.WriteRune(letter)
}
}
}
func MainSet2Challenge12() {
println("Byte-at-a-time ECB decryption (Simple)")
key := GenerateAESKey()
secretMessageAsBase64, _ := base64.StdEncoding.DecodeString("Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgaGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqdXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgYnkK")
keySize := findKeySize(secretMessageAsBase64, key)
println("Keysize is:", keySize)
if IsDecryptedByECB(encrypt([]byte(buildString(keySize*2)+string(secretMessageAsBase64)), key), keySize) {
println("Founded ECB")
} else {
panic("Not founded ECB")
}
brakeEncryptedMessage := byteAtTimeDecryption(secretMessageAsBase64, key, keySize)
if brakeEncryptedMessage != string(secretMessageAsBase64) {
panic("Unable to decrypt message")
}
println("Decrypted message:", brakeEncryptedMessage)
}