HI
I have some problem while using the ReverseRSAES that was sent to me in
the last reply.
I am able to decrypt the the message encrypted by Crypto++
ReverseRSAES<PKCS1v15>::Encryptor,
But when I try to decrypt the message from Cisico router, it failed.
I tried the same with SSL RSA_public_decrypt function, and it succeeded.
I am copying the the code and output for both Crypto++ and SSL. Please
help me to find the problem with this.
Thank You
Subbu
-----Original Message-----
From: Wei Dai [mailto:[EMAIL PROTECTED]
Sent: Friday, October 15, 2004 10:57 PM
To: [EMAIL PROTECTED]
Subject: Re: ISAKMP HASH_I/HASH_R encryption with RSA Private key
Please ignore what I said in my private reply. (I didn't notice you sent
a
public post as well as a private email.) That will work for the
encryption, but not the decryption. Try the attached code instead.
On Fri, Oct 15, 2004 at 12:43:06PM -1000, Mukkamala, Subbarayudu wrote:
> Hi:
> I am trying to use RSA algorithms from Crypto ++ 5.2.1 library for
IPSec.
>
> I need some clarification on signature generation using RSA,
interpreting the following from IKE standard [rfc 2409] section 5.1.
>
> -------------- RFC 2409 Section 5.1---------------------------------
> In general the signature will be over HASH_I and HASH_R as above
> using the negotiated prf, or the HMAC version of the negotiated
hash
> function (if no prf is negotiated). However, this can be overridden
> for construction of the signature if the signature algorithm is
tied
> to a particular hash algorithm (e.g. DSS is only defined with SHA's
> 160 bit output). In this case, the signature will be over HASH_I
and
> HASH_R as above, except using the HMAC version of the hash
algorithm
> associated with the signature method. The negotiated prf and hash
> function would continue to be used for all other prescribed pseudo-
> random functions.
>
> Since the hash algorithm used is already known there is no need to
> encode its OID into the signature. In addition, there is no binding
> between the OIDs used for RSA signatures in PKCS #1 and those used
in
> this document. Therefore, RSA signatures MUST be encoded as a
private
> key encryption in PKCS #1 format and not as a signature in PKCS #1
> format (which includes the OID of the hash algorithm). DSS
signatures
> MUST be encoded as r followed by s.
> -------------- RFC 2409 Section 5.1---------------------------------
>
> I See the above to do the followign steps: See at
http://www.netsys.com/ipsec/1998/msg00347.html
>
> - ISAKMP produces HASH_I/HASH_R however it wishes
>
> - the hash is used as input data for encryption with the RSA private
key, with padding as required by the RSA algorithm
>
> - the (key bits) of encryption output is passed over the wire as the
signature
>
> As I see RSA encryption algorithm of Crypto++ usually takes only
public key, NOT private key except in case of RSA Signature generation.
>
> But as the spec indicates that we can not use RSA signature provided
by Crypto++ as it encodes OID os algorithm Can you tell how to encrypt
HASH_I/HASH_R with RSA private key using Crypto++?
>
> Please let me know.
>
> Thank You
> Subbu
>
>
Public Key from the Cisco Router:
305C300D 06092A86 4886F70D 01010105 00034B00 30480241 00C9303D D58D4EE0
12445584 3EB615F8 5CF79695 A2C3DC56 0249683D E63FF490 4CF4FAB0 5F3F109E
6BFAA619 A3BBA368 E745BC58 015EEF04 639D7CB2 930BFCEE 11020301 0001
Encrypted Text:
133BAE7964AF3E65377DFDB2F9DB7078DED219D8C56020333134EBF5689CF729D9E7C296F88ABF2F48322B68AF7588F3669F7644B84C5B4BF5F5419B97AFF60C
Crypto++ Code
INT32 MyRSADecryptor2(const char *pubFilename, char *ciphertext, char *result_str)
{
DecodingResult isValid;
try
{
std::string timeSeed;
timeSeed = IntToString(time(NULL));
const char* seed = timeSeed.c_str();
RandomPool randPool;
randPool.Put((byte *)seed, strlen(seed));
cout << "Using seed: " << seed << endl << endl;
// GlobalRNG().Put((const byte *)seed, strlen(seed));
FileSource pubFile(pubFilename, true, new HexDecoder);
ReverseTrapdoorFunctionPublic<RSA> pub;
pub.BERDecode(pubFile);
ReverseRSAES<PKCS1v15>::Decryptor d(pub);
string result;
StringSource(ciphertext, true, new HexDecoder(new
PK_DecryptorFilter(randPool, d, new StringSink(result))));
strcpy (result_str, result.c_str());
}
catch(CryptoPP::Exception &e)
{
cout << "\nCryptoPP::Exception caught: " << e.what() << endl;
return -1;
}
return 1;
}
Crypto++ Output:
CryptoPP::Exception caught: ReverseRSA/EME-PKCS1-v1_5: invalid ciphertext
SSL: Code
static int CiscoKey(RSA *key)
{
static unsigned char n[] =
"\x00\xC9\x30\x3D\xD5\x8D\x4E\xE0\x12\x44\x55\x84\x3E\xB6\x15\xF8\x5C\xF7\x96\x95\xA2\xC3\xDC\x56\x02\x49\x68\x3D\xE6\x3F\xF4\x90\x4C\xF4\xFA\xB0\x5F\x3F\x10\x9E\x6B\xFA\xA6\x19\xA3\xBB\xA3\x68\xE7\x45\xBC\x58\x01\x5E\xEF\x04\x63\x9D\x7C\xB2\x93\x0B\xFC\xEE\x11";
static unsigned char e[] = "\x01\x00\x01";
key->n = BN_bin2bn(n, sizeof(n)-1, key->n);
key->e = BN_bin2bn(e, sizeof(e)-1, key->e);
}
key = RSA_new();
CiscoKey(key);
RSA_public_decrypt(clen, ctext, ptext, key, padding);
SSL Output:
SSL RSA_public_decrypt(clen, ctext, ptext, key, RSA_PKCS1_PADDING); Output:
9E D7 8A 52 29 9A 84 5A 00 51 A5 69 D7 FA 3D C7
SSL RSA_public_decrypt(clen, ctext, ptext, key, RSA_NO_PADDING); Output:
00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 9E D7 8A 52 29 9A
84 5A 00 51 A5 69 D7 FA 3D C7