如何解密为RSA c ++的字符串值

时间:2016-11-22 03:55:40

标签: c++ encryption cryptography rsa

我很难解密使用RSA算法我从解密函数的结果得到的是一个数值而不是用户输入的实际字符串值。

这是我的代码

#include <iostream>
#include <cstdlib>
#include <string>
#include <ctime>
#include <math.h>
#include <exception>
#include <stdexcept>
#include <vector>
using namespace std;
int main(){
    long int v2 = (rand() % 900 + 800);
    long int v1 = (rand() % 900 + 800);
    for (int i=v1; i<v1+100; i++)
    {
        bool prime=true;
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0)
            {
                prime=false;
                break;
            }   
        }
        if(prime){
            // v2 = int a[i];
            cout << i << " ";
        }
    }
    int d;
    int e = 3;
    int p = 1087;
    int q = 1091;
    int p1 = (p-1);
    int p2 = (q-1);
    int phi = p1*p2;
    int n = p*q;
    int d_value;
    cout<<"phi is " <<phi<<endl;
    cout<<"n is " <<n<<endl;

    int sk;
    //Simple iteration to find d using forloop. E*Dmodn = 1
    for(int i=1;i>0;i++)
    {
        int x=i*e;
        d=x%n;
        if(d==1)  //E*Dmodn = 1
        {
            d_value=i;
            cout<<"\n\n Private Key ::"<<d_value;
            break;
        }
    } // end of forloop

    // User Input, option starts here
    string Message;
    int numerical_value_msg[Message.length()]; // Dynamic array allocation
    cout << "Please, enter your full name: ";
    getline (cin,Message);
    cout << Message << "!\n";
    for(int i = 0; i<Message.length(); i++){ // Trying to transfer string of character to numerical value
        numerical_value_msg[i] = Message[i];
    }
    cout<<numerical_value_msg<<endl; // Output of Numerical Value of Message

    // Encryption starts here
    int size = sizeof(numerical_value_msg);
    int encryption_value[100];
    int m_e_value[100];
    for(int i=0; i<size;i++){
        m_e_value[i] = pow(numerical_value_msg[i],e); //exponent from math.h
        encryption_value[i] = m_e_value[i]%n;
        //cout<<"e"<<encryption_value<<endl;
         cout<<"e"<<encryption_value<<endl;
        }

    //Decryption Value
    int size2 = sizeof(encryption_value);
    int c_d_value[100];
    char actual_value[Message.length()];

    for(int i=0; i<Message.length();i++){
        cout<<"DValue"<<d_value<<endl;
        c_d_value[i] = pow(encryption_value[i],d_value);
        actual_value[i] = (m_e_value[i]%n)+96; // + 96 to convert it to Letter value
    }
    cout<<"Actual value"<<actual_value<<endl;
}

MyOutput读取为

Private Key ::395306 Please, enter Text TO convert: 
Hello Hello!
0x7fff5fbfedd0
encrytion value is 0x7fff5fbff620
encrytion value is 0x7fff5fbff620
encrytion value is 0x7fff5fbff620
encrytion value is 0x7fff5fbff620
encrytion value is 0x7fff5fbff620

实际值\375\243\2432 - &gt;如何将其转换为字母格式。

1 个答案:

答案 0 :(得分:0)

代码中的第一个问题是Undefined Behavior at:

string Message;
int numerical_value_msg[Message.length()]; // Dynamic array allocation

// Lines skipped
numerical_value_msg[i] = Message[i];
创建Message数组时,

numerical_value_msg始终为空。之后Message获取它的值,for循环访问内存超出numerical_value_msg中的数组范围。我建议将int[]类型替换为vector<int>。元素在那里连续存储的C ++标准guarantees。这意味着您可以在需要时获取原始数组。

您可以指定operator<<将数据打印到cout

template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
  if (!v.empty()) {
    out << '[';
    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
    out << "\b\b]";
  }
  return out;
}

我假设您使用vector<int>作为加密值。在这种情况下,上面的运算符将输出值而不是指针地址0x7fff5fbfedd0

  

实际值\ 375 \ 243 \ 2432 - &gt;如何将其转换为字母格式

您不需要在解密值中添加任何96常量。解密后你应该得到原始值。它没有发生的原因是int值溢出。重新检查您的计算和结果值,例如您需要将c_d_value类型更改为std::vector<unsigned long long> c_d_value