dear all
i made a code to sign some data then verify it part of this data should be
encrypted using rsa then sign it my problems is
1- i generate rsa key pairs and try to print it in a pem file but when i
open the file it was empty
2- when i use function RSA_public_encrypt () to encrypt some data it does
nothing because i print the data using cout<< before encryption then print
it after encryption it was the same
3- the sign function RSA_sign () has a problem
No source available for "RSA_sign() at 0xb7e525e5"
i have attached the code may be this help to solve my problem and know what
i did wrong
thx allot for help
--
Warmest regards and best wishes for a good health,*urs sincerely *
*mero*
//============================================================================
// Name : rsa_sign.cpp
// Author : Amir
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include "sign.h"
using namespace std;
int main()
{
Sign test;
test.SetANData(16);
test.SetGSData(16,256);
test.EncryptSharedKey();
test.DecryptSharedKey();
test.SignData();
test.VerifyData();
return 0;
}
/*
* sign.cc
*
* Created on: Nov 1, 2014
* Author: amir
*/
#include "sign.h"
Sign::Sign()
{
SetSharedKey();
GenerateRSAPairs();
}
Sign::~Sign()
{
RSA_free(m_rsa_pair);
}
void
Sign::SetANData(int size)
{
cout<<"andata is "<<endl;
for (int i = 0 ; i<size ; i++)
{
m_anData[i]=i;
cout<<m_anData[i];
}
cout<<endl;
}
void
Sign::SetGSData(int size, int sharedkeysize)
{
cout<<"gsdata is "<<endl;
int totalsize = size +sharedkeysize;
for (int i = 0 ; i<size ; i++)
{
m_gsData[i]=i;
cout<<m_gsData[i];
}
for (int j = size ; j<totalsize ; j++)
{
m_gsData[j]= m_sharedKey[j];
cout<<m_gsData[j];
}
cout<<endl;
}
void
Sign::SetSharedKey()
{
cout<<"shared key is "<<endl;
for (int i = 0; i<256 ; i++)
{
m_sharedKey[i] = i;
cout<<m_sharedKey[i];
}
cout<<endl;
}
void
Sign::GenerateRSAPairs()
{
m_rsa_pair = RSA_generate_key(2048,RSA_F4,NULL,NULL);
BIO *pubout = NULL;
const char szPath[10] = "rsa.pem";
pubout = BIO_new_file(szPath,"wb");
PEM_write_bio_RSAPublicKey (pubout , m_rsa_pair);
}
void
Sign::EncryptSharedKey()
{
int padding = RSA_PKCS1_PADDING;
RSA_public_encrypt(256,m_sharedKey,m_encryptedSharedKey,m_rsa_pair,padding);
cout<<"encrypted shared key is "<<endl;
for (int i = 0 ; i<2048 ; i++)
{
cout<<m_encryptedSharedKey[i];
}
cout<<endl;
}
void
Sign::DecryptSharedKey()
{
int padding = RSA_PKCS1_PADDING;
RSA_private_decrypt(2048,m_encryptedSharedKey,m_sharedKey,m_rsa_pair,padding);
cout<<" shared key is "<<endl;
for (int i = 0 ; i<2048 ; i++)
{
cout<<m_sharedKey[i];
}
cout<<endl;
}
void
Sign::SignData()
{
cout<<"i'm here"<<endl;
unsigned int *siglen = NULL;
RSA_sign(NID_sha1, m_anData, 16, m_ANsignedData, siglen, m_rsa_pair);
cout<<"sign length is "<<*siglen<<endl;
}
bool
Sign::VerifyData()
{
int status = 0;
status = RSA_verify(NID_sha1, m_anData, AN_Data_Size, m_ANsignedData, 256,m_rsa_pair);
if (status == 1)
{
return true;
cout<<"verification is ok"<<endl;
}
else
{
return false;
cout<<"verification fail"<<endl;
}
return false;
}
/*
* sign.h
*
* Created on: Nov 1, 2014
* Author: amir
*/
#ifndef SIGN_H_
#define SIGN_H_
#include <iostream>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/x509.h>
#include <openssl/conf.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define Shared_Key_Size 256
#define AN_Data_Size 16
#define GS_Data_Size 16
class Sign
{
public:
Sign();
~Sign();
void SetANData(int size);
void SetGSData(int size,int sharedkeysize);
void SetSharedKey();
void GenerateRSAPairs ();
void EncryptSharedKey();
void DecryptSharedKey();
void SignData();
bool VerifyData();
private:
unsigned char m_sharedKey[Shared_Key_Size];
unsigned char m_anData[AN_Data_Size];
unsigned char m_gsData[GS_Data_Size];
unsigned char m_encryptedSharedKey[2048];
unsigned char m_ANsignedData[256];
RSA *m_rsa_pair;
};
#endif /* SIGN_H_ */