⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc4.c

📁 用RC4算法实现控制台对所有文件(任意类型的文件)的加解密(注意明文和密文都以文件形式存在)
💻 C
字号:
#include <stdio.h>
char *EnDeCrypt(char *pszText, int iTextLen,char *pszKey);
void swapints(int *array, int ndx1, int ndx2);

/* Test harness for the EnDeCrypt function below.   */
int main()
{
    char buf[256], passwd[16], *pEncrypted, *pDecrypted, *pch;
    int ix, iLen;

    for (;;)
    {
        printf("输入要加密的的明文: ");
        fgets(buf, sizeof(buf), stdin);
		for (ix = strlen(buf) - 1; (ix >= 0) && (buf[ix] == 10); ix--)
			buf[ix] = 0;
        if (!buf[0])
            break;
        printf("\n密钥: ");
        fgets(passwd, sizeof(passwd), stdin);
		for (ix = strlen(passwd) - 1; (ix >= 0) && (passwd[ix] == 10); ix--)
			passwd[ix] = 0;
        if (!passwd[0])
            break;
		iLen = strlen(buf);
        pEncrypted = EnDeCrypt(buf, iLen, passwd);
        printf("\n加密输出:\n");
        for (pch = pEncrypted, ix=0; ix < iLen; pch++, ix++)
        {
            if (!(ix % 20))
                printf("\n");
            printf("%1X ", (unsigned char)*pch);
        }
        pDecrypted = EnDeCrypt(pEncrypted, iLen, passwd);
		pDecrypted[iLen] = 0;	/* Null-terminate */
        printf("\n解密后是: %s", pDecrypted);
        free(pEncrypted);
        free(pDecrypted);
    }
    return 0;
}



char *EnDeCrypt(char *pszText, int iTextLen,char *pszKey)
{
    char *cipher;                       /* Output buffer                */
    int a, b, i=0, j=0, k;              /* Ambiguously named counters   */
    int ilen;                           /* Length of a string           */
    int sbox[256];                      /* Encryption array             */
    int key[256];                       /* Numeric key values           */

    ilen = strlen(pszKey);

    for (a=0; a < 256; a++)
    {
        key[a] = pszKey[a % ilen];
        sbox[a] = a;
    }

    for (a=0, b=0; a < 256; a++)
    {
        b = (b + sbox[a] + key[a]) % 256;
        swapints(sbox, a, b);
    }

    cipher = (char *)malloc(iTextLen);

    for (a=0; a < iTextLen; a++)
    {
        i = (i + 1) % 256;
        j = (j + sbox[i]) % 256;
        swapints(sbox, i, j);
        k = sbox[(sbox[i] + sbox[j]) % 256];
        cipher[a] = pszText[a] ^ k;
    }
    return cipher;
}


void swapints(int *array, int ndx1, int ndx2)
{
    int temp = array[ndx1];
    array[ndx1] = array[ndx2];
    array[ndx2] = temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -