RSA算法在C 中的植入

implantation of RSA algorithm in c++

本文关键字:算法 RSA      更新时间:2023-10-16

我正在研究一个项目,以实现C 中的RSA算法,我以前不知道C ,但我仍在学习,我在RSA中的问题是如何将字符编码为0-25的数字:一个编码为0,b至1,C至2,。。z至25,

这是我的代码:

/*
 * C++ Program to Implement the RSA Algorithm
 */
#include<iostream>
#include<math.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
long int p, q, n, t, flag, e[100], d[100], temp[100], j, m[100], en[100], i;
char msg[100];
int prime(long int);
void ce();
long int cd(long int);
void encrypt();
void decrypt();
int prime(long int pr)
{
    int i;
    j = sqrt(pr);
    for (i = 2; i <= j; i++)
    {
        if (pr % i == 0)
            return 0;
    }
    return 1;
}
int main()
{
    cout << "nENTER FIRST PRIME NUMBERn";
    cin >> p;
    flag = prime(p);
    if (flag == 0)
    {
        cout << "nWRONG INPUTn";
        exit(1);
    }
    cout << "nENTER ANOTHER PRIME NUMBERn";
    cin >> q;
    flag = prime(q);
    if (flag == 0 || p == q)
    {
        cout << "nWRONG INPUTn";
        exit(1);
    }
    cout << "nENTER MESSAGEn";
    fflush(stdin);
    cin >> msg;
    for (i = 0; msg[i] != NULL; i++)
        m[i] = msg[i];
    n = p * q;
    t = (p - 1) * (q - 1);
    ce();
    cout << "nPOSSIBLE VALUES OF e AND d AREn";
    for (i = 0; i < j - 1; i++)
        cout << e[i] << "t" << d[i] << "n";
    encrypt();
    decrypt();
    return 0;
}
void ce()
{
    int k;
    k = 0;
    for (i = 2; i < t; i++)
    {
        if (t % i == 0)
            continue;
        flag = prime(i);
        if (flag == 1 && i != p && i != q)
        {
            e[k] = i;
            flag = cd(e[k]);
            if (flag > 0)
            {
                d[k] = flag;
                k++;
            }
            if (k == 99)
                break;
        }
    }
}
long int cd(long int x)
{
    long int k = 1;
    while (1)
    {
        k = k + t;
        if (k % x == 0)
            return (k / x);
    }
}
void encrypt()
{
    long int pt, ct, key = e[0], k, len;
    i = 0;
    len = strlen(msg);
    while (i != len)
    {
        pt = m[i];
        pt = pt - 96;
        k = 1;
        for (j = 0; j < key; j++)
        {
            k = k * pt;
            k = k % n;
        }
        temp[i] = k;
        ct = k + 96;
        en[i] = ct;
        i++;
    }
    en[i] = -1;
    cout << "nTHE ENCRYPTED MESSAGE ISn";
    for (i = 0; en[i] != -1; i++)
        printf("%c", en[i]);
}
void decrypt()
{
    long int pt, ct, key = d[0], k;
    i = 0;
    while (en[i] != -1)
    {
        ct = temp[i];
        k = 1;
        for (j = 0; j < key; j++)
        {
            k = k * ct;
            k = k % n;
        }
        pt = k + 96;
        m[i] = pt;
        i++;
    }
    m[i] = -1;
    cout << "nTHE DECRYPTED MESSAGE ISn";
    for (i = 0; m[i] != -1; i++)
        printf("%c", m[i]);
}

不确定我会得到您的问题,但我的赌注是您在问如何在ASCII和字符的数字表示之间转换。

编码/解码与 RSA 无关。您只需使用动态范围移动。由于字母在 ascii 中的顺序增加,因此唯一剩下的就是将aA取代为零。

对于小写字符到数字转换,请尝试:

char c='m';  // c is you character m for example
int i=c-`a`; // i is output number 

如果您同时获得了小写字母和大写字母,则需要将其更改为:

char c='q';  // c is you character q for example
int i;       // i is output number 
if ((c>='a')&&(c<='z')) i=c-'a';
 else                   i=c-'A';`

其中 c是您的角色,而i是输出编号

对于char转换的数字尝试:

c=i+`a`;

或大写:

c=i+`A`;