// 字节右移n位,例如右移3,1010 0101 -> 1011 0100
unsigned char RorByte(char bData, size_t n)
{
char temp = bData >> (8 - n);
bData = bData << n;
bData |= temp;
return bData;
}
//加密函数:先与密钥异或,然后取反,然后右移3位
void NativeEncrypt(void* pData, size_t byteDataLen, const void* pKey, const size_t byteKeyLen)
{
size_t uDataIndex = 0, uKeyIndex = 0;
for (; uDataIndex < byteDataLen; uDataIndex++)
{
((char*)pData)[uDataIndex] = ((char*)pData)[uDataIndex] ^ ((char*)pKey)[uKeyIndex];
((char*)pData)[uDataIndex] = ~((char*)pData)[uDataIndex];
RorByte(((unsigned char*)pData)[uDataIndex], 3);
uKeyIndex++;
if (uKeyIndex == byteKeyLen) uKeyIndex = 0;
}
}
//解密函数:先右移5位,然后取反,再与密钥异或
void NativeDecrypt(void* pData, size_t byteDataLen, const void* pKey, const size_t byteKeyLen)
{
size_t uDataIndex = 0, uKeyIndex = 0;
for (; uDataIndex < byteDataLen; uDataIndex++)
{
RorByte(((char*)pData)[uDataIndex], 56);
((char*)pData)[uDataIndex] = ~((char*)pData)[uDataIndex];
((char*)pData)[uDataIndex] ^= ((char*)pKey)[uKeyIndex];
uKeyIndex++;
if (uKeyIndex == byteKeyLen) uKeyIndex = 0;
}
}
使用起来也是非常简单
int main(int args, char* argv[])
{
char data[] = "Hello World!";
int dataLen = strlen(data);
char key[] = "123456";
int keyLen = strlen(key);
printf("加密前:\n");
for (int i = 0; i < dataLen; i++)
printf("%02X ", (unsigned char)data[i]);
printf("\n加密后:\n");
NativeEncrypt((LPVOID)data, dataLen, key, keyLen);
for (int i = 0; i < dataLen; i++)
printf("%02X ", (unsigned char)data[i]);
printf("\n解密后:\n");
NativeDecrypt((LPVOID)data, dataLen, key, keyLen);
for (int i = 0; i < dataLen; i++)
printf("%02X ", (unsigned char)data[i]);
getchar();
return 0;
}