You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
1.7 KiB
92 lines
1.7 KiB
3 years ago
|
# ige
|
||
|
|
||
|
IGE block cipher mode for Go.
|
||
|
|
||
|
Forked from [karlmcguire/ige](https://github.com/karlmcguire/ige).
|
||
|
|
||
|
## about
|
||
|
|
||
|
IGE is a block cipher mode usually used with AES. It's most notably used in Telegram's [MTProto Protocol](https://core.telegram.org/mtproto). It can be defined as the following function:
|
||
|
|
||
|
```
|
||
|
c_i = f_k(p_i ^ c_{i-1}) ^ p_{i-1}
|
||
|
```
|
||
|
|
||
|
* `c_i` is ciphertext of the `i` block
|
||
|
* `p_i` is plaintext of the `i` block
|
||
|
* `f_k` is the block cipher function with `k` as the key
|
||
|
|
||
|
Here is a diagram of the above function:
|
||
|
|
||
|
<p align="center">
|
||
|
<img src="https://i.imgur.com/CpilCFB.png" />
|
||
|
</p>
|
||
|
|
||
|
Note that `c_0` and `m_0` in the diagram represent the initilization vectors. This implementation requires an initialization vector of two blocks. The first block is used as `c_0`. The second block is used as `m_0`.
|
||
|
|
||
|
## testing
|
||
|
|
||
|
I'm using the test vectors described in the [official OpenSSL IGE paper](https://www.links.org/files/openssl-ige.pdf). You can execute the tests yourself by running:
|
||
|
|
||
|
```
|
||
|
$ go test
|
||
|
```
|
||
|
|
||
|
### test vector 1
|
||
|
|
||
|
#### key
|
||
|
|
||
|
```
|
||
|
00010203 04050607 08090A0B 0C0D0E0F
|
||
|
```
|
||
|
|
||
|
#### initialization vector
|
||
|
|
||
|
```
|
||
|
00010203 04050607 08090A0B 0C0D0E0F
|
||
|
10111213 14151617 18191A1B 1C1D1E1F
|
||
|
```
|
||
|
|
||
|
#### plaintext
|
||
|
|
||
|
```
|
||
|
00000000 00000000 00000000 00000000
|
||
|
00000000 00000000 00000000 00000000
|
||
|
```
|
||
|
|
||
|
#### ciphertext
|
||
|
|
||
|
```
|
||
|
1A8519A6 557BE652 E9DA8E43 DA4EF445
|
||
|
3CF456B4 CA488AA3 83C79C98 B34797CB
|
||
|
```
|
||
|
|
||
|
### test vector 2
|
||
|
|
||
|
#### key
|
||
|
|
||
|
```
|
||
|
54686973 20697320 616E2069 6D706C65
|
||
|
```
|
||
|
|
||
|
#### initialization vector
|
||
|
|
||
|
```
|
||
|
6D656E74 6174696F 6E206F66 20494745
|
||
|
206D6F64 6520666F 72204F70 656E5353
|
||
|
```
|
||
|
|
||
|
#### plaintext
|
||
|
|
||
|
```
|
||
|
99706487 A1CDE613 BC6DE0B6 F24B1C7A
|
||
|
A448C8B9 C3403E34 67A8CAD8 9340F53B
|
||
|
```
|
||
|
|
||
|
#### ciphertext
|
||
|
|
||
|
```
|
||
|
4C2E204C 65742773 20686F70 65204265
|
||
|
6E20676F 74206974 20726967 6874210A
|
||
|
```
|