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.
 
 
 
 
 
 

72 lines
1.9 KiB

#include "encrypt.h"
#include <openssl/md5.h>
void encrypt(char *buf, int len) {
char *end = buf + len;
while (buf < end) {
*buf = (char)encrypt_table[(unsigned char)*buf];
buf++;
}
}
void decrypt(char *buf, int len) {
char *end = buf + len;
while (buf < end) {
*buf = (char)decrypt_table[(unsigned char)*buf];
buf++;
}
}
int send_encrypt(int sock, char *buf, int len, int flags) {
char mybuf[4096];
memcpy(mybuf, buf, len);
encrypt(mybuf, len);
return send(sock, mybuf, len, flags);
}
int recv_decrypt(int sock, char *buf, int len, int flags) {
char mybuf[4096];
int result = recv(sock, mybuf, len, flags);
memcpy(buf, mybuf, len);
decrypt(buf, len);
return result;
}
inline int random_compare(unsigned char x, unsigned char y, unsigned int i, unsigned long long a) {
return (a % (x + i) - a % (y + i));
}
void get_table(const unsigned char* key) {
unsigned char *table = encrypt_table;
unsigned char *tmp_hash;
tmp_hash = MD5((const unsigned char*)key, strlen((const char*)key), NULL);
unsigned long long a;
a = *(unsigned long long *)tmp_hash;
unsigned int i;
for(i = 0; i < 256; ++i) {
table[i] = i;
}
for(i = 1; i < 1024; ++i) {
// use bubble sort in order to keep the array stable as in Python
int k,j;
unsigned char t;
for(k = 256 - 2; k >= 0; --k)
{
for(j = 0;j <= k; ++j)
{
if(random_compare(table[j], table[j + 1], i, a) > 0)
{
t=table[j];
table[j]=table[j + 1];
table[j + 1]=t;
}
}
}
}
for(i = 0; i < 256; ++i) {
// gen decrypt table from encrypt table
decrypt_table[encrypt_table[i]] = i;
}
}