#include <stdint.h>
//#include "tools.h"
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
#define END_EXPE() do{}while(0);
#define START_ENCRYPT() do{}while(0);
#define START_DECRYPT() do{}while(0);
#define ROTATE_LEFT_8(x,n) ( ((x) << (n)) | ((x) >> (8-(n))) )
#define ROTATE_LEFT_16(x,n) ( ((x) << (n)) | ((x) >> (16-(n))) )
#define ROTATE_LEFT_32(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
#define ROTATE_LEFT_64(x,n) ( ((x) << (n)) | ((x) >> (64-(n))) )
#define ROTATE_RIGHT_8(x,n) ( ((x) >> (n)) | ((x) << (8-(n))) )
#define ROTATE_RIGHT_16(x,n) ( ((x) >> (n)) | ((x) << (16-(n))) )
#define ROTATE_RIGHT_32(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) )
#define ROTATE_RIGHT_64(x,n) ( ((x) >> (n)) | ((x) << (64-(n))) )
void KeyExpansion ( u32 l[], u32 k[] )
{
u8 i;
for ( i=0 ; i<25 ; i++ )
{
l[i+2] = ( k[i] + ROTATE_RIGHT_32(l[i], 8) ) ^ i;
k[i+1] = ROTATE_LEFT_32(k[i], 3) ^ l[i+2];
}
}
void Encrypt ( u32 text[], u32 crypt[], u32 key[] )
{
u8 i;
crypt[0] = text[0];
crypt[1] = text[1];
for ( i=0 ; i<26 ; i++ )
{
crypt[0] = ( ROTATE_RIGHT_32(crypt[0], 8) + crypt[1] ) ^ key[i];
crypt[1] = ROTATE_LEFT_32(crypt[1], 3) ^ crypt[0];
}
}
void Decrypt ( u16 text[], u16 crypt[], u16 key[] )
{
u8 i;
crypt[0] = text[0];
crypt[1] = text[1];
for ( i=0 ; i<26 ; i++ )
{
crypt[1] = ROTATE_RIGHT_32( crypt[0] ^ crypt[1], 3);
crypt[0] = ROTATE_LEFT_32( (crypt[0] ^ key[25-i]) - crypt[1], 8 );
}
}
int main ()
{
u8 test = 11110000;
u8 test2;
u32 text[2];
text[0] = 0x74614620;
text[1] = 0x736e6165;
u32 crypt[2] = {0};
u32 l[26] = {0};
u32 k[25] = {0};
l[1] = 0x13121110;
l[0] = 0x0b0a0908;
k[0] = 0x03020100;
Encrypt ( text, crypt, k );
printf("%x %x\n%x %x\n\n\n", text
[0], text
[1], crypt
[0], crypt
[1]); Decrypt ( text, crypt, k );
printf("%x %x\n%x %x\n\n\n", text
[0], text
[1], crypt
[0], crypt
[1]);
// printf("test %x = ", test);
// test2= ROTATE_RIGHT_8(test,2);
// printf("%x \n\n\n", test2);
return 0;
}
I2luY2x1ZGUgPHN0ZGludC5oPgovLyNpbmNsdWRlICJ0b29scy5oIgoKdHlwZWRlZiB1aW50OF90IHU4Owp0eXBlZGVmIHVpbnQxNl90IHUxNjsKdHlwZWRlZiB1aW50MzJfdCB1MzI7CiNkZWZpbmUgRU5EX0VYUEUoKSBkb3t9d2hpbGUoMCk7CiNkZWZpbmUgU1RBUlRfRU5DUllQVCgpIGRve313aGlsZSgwKTsKI2RlZmluZSBTVEFSVF9ERUNSWVBUKCkgZG97fXdoaWxlKDApOwoKI2RlZmluZSBST1RBVEVfTEVGVF84KHgsbikgKCAoKHgpIDw8IChuKSkgfCAoKHgpID4+ICg4LShuKSkpICkKI2RlZmluZSBST1RBVEVfTEVGVF8xNih4LG4pICggKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMTYtKG4pKSkgKQojZGVmaW5lIFJPVEFURV9MRUZUXzMyKHgsbikgKCAoKHgpIDw8IChuKSkgfCAoKHgpID4+ICgzMi0obikpKSApCiNkZWZpbmUgUk9UQVRFX0xFRlRfNjQoeCxuKSAoICgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDY0LShuKSkpICkKCiNkZWZpbmUgUk9UQVRFX1JJR0hUXzgoeCxuKSAoICgoeCkgPj4gKG4pKSB8ICgoeCkgPDwgKDgtKG4pKSkgKQojZGVmaW5lIFJPVEFURV9SSUdIVF8xNih4LG4pICggKCh4KSA+PiAobikpIHwgKCh4KSA8PCAoMTYtKG4pKSkgKQojZGVmaW5lIFJPVEFURV9SSUdIVF8zMih4LG4pICggKCh4KSA+PiAobikpIHwgKCh4KSA8PCAoMzItKG4pKSkgKQojZGVmaW5lIFJPVEFURV9SSUdIVF82NCh4LG4pICggKCh4KSA+PiAobikpIHwgKCh4KSA8PCAoNjQtKG4pKSkgKQoKCnZvaWQgS2V5RXhwYW5zaW9uICggdTMyIGxbXSwgdTMyIGtbXSApCnsKICAgIHU4IGk7CiAgICBmb3IgKCBpPTAgOyBpPDI1IDsgaSsrICkKICAgIHsKICAgICAgICBsW2krMl0gPSAoIGtbaV0gKyBST1RBVEVfUklHSFRfMzIobFtpXSwgOCkgKSBeIGk7CiAgICAgICAga1tpKzFdID0gUk9UQVRFX0xFRlRfMzIoa1tpXSwgMykgXiBsW2krMl07CiAgICB9Cn0KCnZvaWQgRW5jcnlwdCAoIHUzMiB0ZXh0W10sIHUzMiBjcnlwdFtdLCB1MzIga2V5W10gKQp7CiAgICB1OCBpOwogICAgY3J5cHRbMF0gPSB0ZXh0WzBdOwogICAgY3J5cHRbMV0gPSB0ZXh0WzFdOwoKICAgIGZvciAoIGk9MCA7IGk8MjYgOyBpKysgKQogICAgewogICAgICAgIGNyeXB0WzBdID0gKCBST1RBVEVfUklHSFRfMzIoY3J5cHRbMF0sIDgpICsgY3J5cHRbMV0gKSBeIGtleVtpXTsKICAgICAgICBjcnlwdFsxXSA9IFJPVEFURV9MRUZUXzMyKGNyeXB0WzFdLCAzKSBeIGNyeXB0WzBdOwogICAgfQp9Cgp2b2lkIERlY3J5cHQgKCB1MTYgdGV4dFtdLCB1MTYgY3J5cHRbXSwgdTE2IGtleVtdICkKewogICAgdTggaTsKICAgIGNyeXB0WzBdID0gdGV4dFswXTsKICAgIGNyeXB0WzFdID0gdGV4dFsxXTsKCiAgICBmb3IgKCBpPTAgOyBpPDI2IDsgaSsrICkKICAgIHsKICAgICAgICBjcnlwdFsxXSA9IFJPVEFURV9SSUdIVF8zMiggY3J5cHRbMF0gXiBjcnlwdFsxXSwgMyk7CiAgICAgICAgY3J5cHRbMF0gPSBST1RBVEVfTEVGVF8zMiggKGNyeXB0WzBdIF4ga2V5WzI1LWldKSAtIGNyeXB0WzFdLCA4ICk7CiAgICB9Cn0KCmludCBtYWluICgpCnsKCXU4IHRlc3QgPSAxMTExMDAwMDsKCXU4IHRlc3QyOwogICAgdTMyIHRleHRbMl07CiAgICB0ZXh0WzBdID0gMHg3NDYxNDYyMDsKICAgIHRleHRbMV0gPSAweDczNmU2MTY1OwogICAgdTMyIGNyeXB0WzJdID0gezB9OwogICAgdTMyIGxbMjZdID0gezB9OwogICAgdTMyIGtbMjVdID0gezB9OwogICAgbFsxXSA9IDB4MTMxMjExMTA7CiAgICBsWzBdID0gMHgwYjBhMDkwODsKICAgIGtbMF0gPSAweDAzMDIwMTAwOwogIAogIAogICAgRW5jcnlwdCAoIHRleHQsIGNyeXB0LCBrICk7CiAgICBwcmludGYoIiV4ICV4XG4leCAleFxuXG5cbiIsIHRleHRbMF0sIHRleHRbMV0sIGNyeXB0WzBdLCBjcnlwdFsxXSk7CiAgICBEZWNyeXB0ICggdGV4dCwgY3J5cHQsIGsgKTsKICAgIHByaW50ZigiJXggJXhcbiV4ICV4XG5cblxuIiwgdGV4dFswXSwgdGV4dFsxXSwgY3J5cHRbMF0sIGNyeXB0WzFdKTsKIAkKIAkvLyBwcmludGYoInRlc3QgJXggPSAiLCB0ZXN0KTsKIAkvLyB0ZXN0Mj0gUk9UQVRFX1JJR0hUXzgodGVzdCwyKTsKIAkvLyBwcmludGYoIiV4IFxuXG5cbiIsIHRlc3QyKTsKCiAgICByZXR1cm4gMDsKfQ==