This is a simple library for the encryption and decryption of plain text in Go/Golang. This library was written on pure go without any packages. All code is implemented in 269 lines.
There are two algorythms for encryption in this library:
- Encryption with an S-box lookup table
- Encryption with P-box permutation.
This function splits plain text strings on an 8-bit list. Then from the 8-bit block make 2 nibble. Example: char "s" is equal to 01110011 bits (UTF8 s == 115 or 01110011). From these bits, we can make two nibbles: 0111 and 0011. Then with the AES S-box table, we can get a new value from this nibble. The first nibble (0111) we use for rows in this table and the second nibble(0011) is for columns, the result for block "s" is 8f hex or 143 decimal or 10001111 bits. After this step, the new swapped block is XORed with a round key. This process repeated for each block and then for all rounds. When all steps were done each block was converted into the hex value, this is how we get a cipher text.
Library API for Sbox algo:
plainText := "Hello World and Distributed Lab team! My name is Den'ys. I wrote these encryption scripts. Look at README to understand how! :D"
key := "3c45886ac87483a37dbc34ce7bf1fc99917a5ea8c9ba0ebab8a2d42a84d18c98"
cipher_Sbox := goboxcrypt.Encrypt_Sbox(plainText, key)
backtoPlane := goboxcrypt.Decrypt_Sbox(cipher_Sbox, key)
// cipher -> b64f6e6e65c0e3658d6e68c0370668c08acad3b78dca83aab74f68c03d3783c0b74f374542c0ff21c00637454fc0cad3c08a4f069f21d36bc081c0fc8d65b74fc0b7804fd34fc04f061b8d2132b7ca6506c0d31b8dca32b7d36bc03d6565c4c037b7c0e2e4f78affe4c0b765c0aa06684f8dd3b7370668c08065fc42c07c8a
For the S-box table, I used the original AES S-box lookup table:
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 63 | 7c | 77 | 7b | f2 | 6b | 6f | c5 | 30 | 01 | 67 | 2b | fe | d7 | ab | 76 |
10 | ca | 82 | c9 | 7d | fa | 59 | 47 | f0 | ad | d4 | a2 | af | 9c | a4 | 72 | c0 |
20 | b7 | fd | 93 | 26 | 36 | 3f | f7 | cc | 34 | a5 | e5 | f1 | 71 | d8 | 31 | 15 |
30 | 04 | c7 | 23 | c3 | 18 | 96 | 05 | 9a | 07 | 12 | 80 | e2 | eb | 27 | b2 | 75 |
40 | 09 | 83 | 2c | 1a | 1b | 6e | 5a | a0 | 52 | 3b | d6 | b3 | 29 | e3 | 2f | 84 |
50 | 53 | d1 | 00 | ed | 20 | fc | b1 | 5b | 6a | cb | be | 39 | 4a | 4c | 58 | cf |
60 | d0 | ef | aa | fb | 43 | 4d | 33 | 85 | 45 | f9 | 02 | 7f | 50 | 3c | 9f | a8 |
70 | 51 | a3 | 40 | 8f | 92 | 9d | 38 | f5 | bc | b6 | da | 21 | 10 | ff | f3 | d2 |
80 | cd | 0c | 13 | ec | 5f | 97 | 44 | 17 | c4 | a7 | 7e | 3d | 64 | 5d | 19 | 73 |
90 | 60 | 81 | 4f | dc | 22 | 2a | 90 | 88 | 46 | ee | b8 | 14 | de | 5e | 0b | db |
a0 | e0 | 32 | 3a | 0a | 49 | 06 | 24 | 5c | c2 | d3 | ac | 62 | 91 | 95 | e4 | 79 |
b0 | e7 | c8 | 37 | 6d | 8d | d5 | 4e | a9 | 6c | 56 | f4 | ea | 65 | 7a | ae | 08 |
c0 | ba | 78 | 25 | 2e | 1c | a6 | b4 | c6 | e8 | dd | 74 | 1f | 4b | bd | 8b | 8a |
d0 | 70 | 3e | b5 | 66 | 48 | 03 | f6 | 0e | 61 | 35 | 57 | b9 | 86 | c1 | 1d | 9e |
e0 | e1 | f8 | 98 | 11 | 69 | d9 | 8e | 94 | 9b | 1e | 87 | e9 | ce | 55 | 28 | df |
f0 | 8c | a1 | 89 | 0d | bf | e6 | 42 | 68 | 41 | 99 | 2d | 0f | b0 | 54 | bb | 16 |
The column is determined by the least significant nibble, and the row by the most significant nibble. For example, the value 9a16 is converted into b816.
Inverse S-box table
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0a | 0b | 0c | 0d | 0e | 0f | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | 52 | 09 | 6a | d5 | 30 | 36 | a5 | 38 | bf | 40 | a3 | 9e | 81 | f3 | d7 | fb |
10 | 7c | e3 | 39 | 82 | 9b | 2f | ff | 87 | 34 | 8e | 43 | 44 | c4 | de | e9 | cb |
20 | 54 | 7b | 94 | 32 | a6 | c2 | 23 | 3d | ee | 4c | 95 | 0b | 42 | fa | c3 | 4e |
30 | 08 | 2e | a1 | 66 | 28 | d9 | 24 | b2 | 76 | 5b | a2 | 49 | 6d | 8b | d1 | 25 |
40 | 72 | f8 | f6 | 64 | 86 | 68 | 98 | 16 | d4 | a4 | 5c | cc | 5d | 65 | b6 | 92 |
50 | 6c | 70 | 48 | 50 | fd | ed | b9 | da | 5e | 15 | 46 | 57 | a7 | 8d | 9d | 84 |
60 | 90 | d8 | ab | 00 | 8c | bc | d3 | 0a | f7 | e4 | 58 | 05 | b8 | b3 | 45 | 06 |
70 | d0 | 2c | 1e | 8f | ca | 3f | 0f | 02 | c1 | af | bd | 03 | 01 | 13 | 8a | 6b |
80 | 3a | 91 | 11 | 41 | 4f | 67 | dc | ea | 97 | f2 | cf | ce | f0 | b4 | e6 | 73 |
90 | 96 | ac | 74 | 22 | e7 | ad | 35 | 85 | e2 | f9 | 37 | e8 | 1c | 75 | df | 6e |
a0 | 47 | f1 | 1a | 71 | 1d | 29 | c5 | 89 | 6f | b7 | 62 | 0e | aa | 18 | be | 1b |
b0 | fc | 56 | 3e | 4b | c6 | d2 | 79 | 20 | 9a | db | c0 | fe | 78 | cd | 5a | f4 |
c0 | 1f | dd | a8 | 33 | 88 | 07 | c7 | 31 | b1 | 12 | 10 | 59 | 27 | 80 | ec | 5f |
d0 | 60 | 51 | 7f | a9 | 19 | b5 | 4a | 0d | 2d | e5 | 7a | 9f | 93 | c9 | 9c | ef |
e0 | a0 | e0 | 3b | 4d | ae | 2a | f5 | b0 | c8 | eb | bb | 3c | 83 | 53 | 99 | 61 |
f0 | 17 | 2b | 04 | 7e | ba | 77 | d6 | 26 | e1 | 69 | 14 | 63 | 55 | 21 | 0c | 7d |
For this algorithm I've used a similar technique as Sbox but instead substitution table there is permutation box with the next rule for each nibble:
Library API for Pbox algo:
plainText := "Hello World and Distributed Lab team! My name is Den'ys. I wrote these encryption scripts. Look at README to understand how! :D"
key := "3c45886ac87483a37dbc34ce7bf1fc99917a5ea8c9ba0ebab8a2d42a84d18c98"
cipher_Pbox := goboxcrypt.Encrypt_Pbox(plainText, key)
backtoPlane = goboxcrypt.Decrypt_Pbox(cipher_Pbox, key)
fmt.Println("cipher -> ", cipher_Pbox)
fmt.Println("plain text -> ", backtoPlane)
/*
cipher -> db5c5a5a504ff450775a5e4f5d525e4fde59757e7759577c7e5c5e4fda5d574f7e5c5d584d4fd8794f525d585c4f59754fde5c52447975424fd94f7477507e5c4f7e5b5c755c4f5c525577797f7e5950524f755577597f7e75424fda5050514f5d7e4ff7dcddded8dc4f7e504f7c525e5c77757e5d525e4f5b50744d4f63de
plain text -> Hello World and Distributed Lab team! My name is Den'ys. I wrote these encryption scripts. Look at README to understand how! :D
*/