This specification describes the first version of YAFO algorithm. You may create your own implementation that is compatible with it.
Data chunk: a buffer with the length of 8 bytes, which is the minimum processing unit in this algorithm.
Key: a data chunk, derived from the plain text seed phrase.
Chunk sum: a byte calculated by xoring all bytes in a data chunk.
Current key: a key used for processing the current data chunk.
Before starting the encryption, the current key is set to the initial key. Then, for each chunk, perform the following operations:
- Calculate the chunk sum of the plain data, let
c_sum
be it. - Calculate the chunk sum of the current key, let
k_sum
be it. - For each byte in the data-key chunk pair, perform:
- let
factor_a
bek_sum
xor the key byte. - Rotate the data byte left by
factor_a
. - Xor the data byte with the key byte.
- let
- Perform the key rotation with
c_sum
.
The algorithm is symmetric, and the decryption is the reverse operation of the encryption.
The current key must be rotated after being used to encrypt a chunk. To rotate a key, the process requires a chunk sum (c_sum
) as the input along with the key. The whole process has 2 steps:
- For each byte in the key chunk, perform:
- Xor the byte with
c_sum
. - Rotate
c_sum
left once.
- Xor the byte with
- Rotate the bytes in the key chunk left once such that the first byte is move to the end of the key chunk.
The initial key is calculated from a plain text that is used as the seed phrase. The string is encoded with UTF-8 and then hashed using SHA-1. Take the first 8 bytes of the hash result and name it key hash. The initial key is calculated by bitwise-xoring key hash with [0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80]
.