RSA 加解密算法源代码及程序说明 (by 阿新)

来源(www.cnhonker.net)

RSA 加解密算法源代码及程序说明 (by 阿新)

http://www.cnhonker.net 2001年08月21日19:09 bbs.nsfocus.com   双击鼠标滚屏

--------------------------------------------------------------------------------

RSA 256位、512位、1024位 加解密 源代码 及 编译后的执行程序 请在此下载:

http://com.6to23.com/ 中的 Software 部分,有:

rsawork.zip

这个就是编译之后的 RSA 加密算法,内附详细的使用说明(搞笑使用说明~)

rsa.zip

在绿色兵团听说 RSA 提供 20万美圆 给破解其 2048位 加密算法的人,我这里...

分别就是 RAS的加解密程序源代码和可执行程序。

========================================================================

简单解释,RSA算法的实质是通过生成大奇数:p q e m,通过计算,来进行加密。大奇数p q,仅在加密时使用,增加密码复杂度;e m则在加解密程序中都要使用。

本程序只是演示性质,只能对两个DWORD值加密,分别定义为:卡号和计算机标识符。

算法的核心加密代码如下:

void Encrypt()
{
    // 准备p.q.m.e
    private_key pkey;  //私匙类,数据保密
    pkey.p.load(p,VL/2);
    pkey.q.load(q,VL/2);
    pkey.e = e;
    pkey.m.load(m, VL);
    DWORD a[VL];
    //准备要加密的数,这里,只对两个DWORD值加密,卡号和计算机标识符
    //读入卡号和标识符框中的当前值
    memset(a,0,VL*sizeof(DWORD));
    printf("Please Input CardNo & PCID (Fmt %%X-%%X):\n");
    scanf("%lX-%lX",&a[0], &a[1]);
    vlong m;
    m.load(a, 2); //这样 m 中就保存有要加密的数
    //计算加密后的数c
    vlong c = pkey.decrypt(m);
    c.store(a, VL);
    //以下只是对 VL == 8的情况的处理
    //由于pkey中的成员m,是一小于8个DWORD值的数,加密后的 c < pkey.m
    //所以,a[7]的高位总为0, 以防a[6],a[7]过多的高位为0,对a[7]变换处理一下
    a[7] ^= (a[1]+a[2]+a[3]+a[4]);
    a[6] ^= (a[0]+a[5]);
    //加密后的结果就是 a[0]-a[7]
    FILE *fp = fopen("nwnb.txt", "w");
    if(fp != NULL)
    {
        fprintf(fp,"%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n",
        a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
        fclose(fp);
    }
    printf("Encrypt Data:\n");
    printf("%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n",
    a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
}


核心解密代码如下:

void Decrypt()
{
    //准备 [m] [e], 解密只用到 m,e
    public_key pkey;   //公匙类,数据公开
    pkey.e = e;
    pkey.m.load(m, VL);
    DWORD a[VL];
    //读入加密后的VL个DWORD值到a可
    memset(a,0,VL*sizeof(long));
    FILE *fp = fopen("nwnb.txt", "r");
    if(fp != NULL)
    {
        fscanf(fp,"%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX-%08lX\n",
        &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7]);
        fclose(fp);
    }
    //还原a[6],a[7]
    a[7] ^= (a[1]+a[2]+a[3]+a[4]);
    a[6] ^= (a[0]+a[5]);
    //加密的数据保存到m中
    vlong m;
    m.load(a,8);
    //计算加密前的数据,保存在c中
    vlong c = pkey.encrypt(m);
    memset(a,0,8*sizeof(long));
    c.store(a,2);
    // a[0], a[1]就是加密前的数据
    printf("Decrypt Data:\n");
    printf("%08lX-%08lX\n", a[0], a[1]);
}


========================================================================

详细使用说明:

RSA 256位、512位、1024位 加解密使用指南

By Seraph Chutium

-- http://com.6to23.com/ /

-- http://www.cnhack.org/ /

正文:

在 win32 环境的命令行格式中运行 work.exe,

(下载地址: http://www.cnhack.org/downs )

将看到:

-------------------------------------------------------

E:\RSA Project\DEBUG>work
Usage: Work P0         准备256位的加解密
Usage: Work P1         准备512位的加解密
Usage: Work P2         准备1024位的加解密
Usage: Work E          加密
Usage: Work D          解密


-------------------------------------------------------

这个简单的 RSA 算法演示程序只能进行一对DWORD值的加解密处理,

本程序定义这对DWORD值模式为“卡号-计算机标识符”。

如,您现在想对 卡号和计算机标识符 为 78-12000000 的DWORD加密,

您可以按如下步骤:

-------------------------------------------------------

E:\RSA Project\DEBUG>work e
Please Input CardNo & PCID (Fmt %X-%X): //这里提示您输入这对DWORD值
00000078-12000000 //它等同于输入 78-12000000 ,即首位的 0 可以忽略
Encrypt Data:
D42E76DA-BB7A73A7-02F1D66A-EFA5974E-BC033FFD-47B73631-9FF97C2A-35B2F257
//上面就是DWORD值 00000078-12000000 经过 RSA 算法加密的结果

-------------------------------------------------------

这时,您将在 work.exe 的工作路径看到两个新增的文本文件:

nwnb.txt //它是存放加密之后的结果的文件,下文将进一步解释

RSAVar.txt //其中存储了加密程序使用的四个变量 p,q,e,m ,

//此文件的详细内容请参看源代码中 Main.cpp 我的注释

如果您现在想对刚才加密的结果进行解密,或者想给你的情人发个秘密的短信息:

5201314 //我爱你一生一世~~~恶心了点,没办法~举个例子……

这种短信息你总不想被老婆/老公查出来吧~~~用 RSA 加密吧……(有这么做广告的吗?)

-------------------------------------------------------

E:\RSA Project\DEBUG>work e
Please Input CardNo & PCID (Fmt %X-%X):
5201314
Encrypt Data:
37801104-F294EB88-9F473ECA-74DD547A-EF1223D5-304DF9A1-6BED19D3-C6DC2814


-------------------------------------------------------

您现在就可以给您的她发加密过的短信息了:

37801104-F294EB88-9F473ECA-74DD547A-EF1223D5-304DF9A1-6BED19D3-C6DC2814

在对方收到后,把加密过的结果COPY到 nwnb.txt 中,

之后运行 work.exe :

-------------------------------------------------------

E:\RSA Project\DEBUG>work d
Decrypt Data:
05201314-00000000 //这就是解密后的结果其中不足8位的字符自动补0


-------------------------------------------------------

现在您的她就知道您给她发的短信息的含义啦…………

如果您还想在玩的复杂点,可以这样,在5201314前面,加上对方的电话:

-------------------------------------------------------

E:\RSA Project\DEBUG>work e
Please Input CardNo & PCID (Fmt %X-%X):
66886688-5201314 //咦,66开头的,还是军线…………
Encrypt Data:
58C7E4F0-63DB2C57-97B93C0E-CE8FC9BB-FF518D80-731560B9-61B728E4-E03AAC57


-------------------------------------------------------

之后对方收到后,把加密过的结果COPY到 nwnb.txt 中,

-------------------------------------------------------

E:\RSA Project\DEBUG>work d
Decrypt Data:
66886688-05201314 //解密后的结果,不足8位的字符自动补0


-------------------------------------------------------

作者的话:

大家别觉得我无聊啊,我也只是简单举个例子让大家了解 RSA 的加密算法,

大家应该把心思多放在研究其算法结构上……别真的去做那种事!

转载请保持原文完整,谢谢。

=================================================================

最近在这里论坛上看到很多人在议论破解RSA加密算法的人有1万至20万美圆的奖金,我到RSA的主页上看过了,没有看到官方正式宣布过。不过这个算法还是目前加密算法中较常见的一个,看看学习学习没坏处的。

Link: http://www.asm32.net/article_details.aspx?id=35


浏览次数 868 发布时间 2001-12-05 13:48:12 从属分类 ARITHMETIC 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1