Hello guys!

I have a "RSA_verify_Signature" code,
When I give the public key with below sequence,it works fine:

byte pubkey[] ={0x30,0x5A,0x30,0x0D,0x06,0x09,0x2A,0x86,
                0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x49,0x00,
                0x30,0x46,0x02,0x41,0x00,0xD1,0x8A,0x48,0xC0,0x60,0x56,0x27,
                0x32,0x98,0xE4,0x3F,0xB4,0x43,0xF2,0xB9,0xF6,0xA2,0x75,0xF0,
                0x42,0x17,0x07,0xD8,0x4E,0x9C,0x62,0x29,0x19,0xF6,0xE5,0xFB,
                0xDA,0x49,0x6E,0x42,0x85,0xB1,0x1A,0xE3,0x1A,0x1B,0x24,0x7B,
                0x0F,0xCD,0x5F,0x9E,0x3D,0xC1,0x1C,0x7C,0x26,0x06,0xA7,0x28,
                0x88,0xED,0x87,0x2D,0xC7,0xB5,0x2A,0xDB,0x0F,0x02,0x01,0x11};


But I need to zero "n" & "e" parts in one section of my program (my
program needs Public key to be zero in a
section)
So, I decode it's sequence with "DumpASN.1" program available in
"http://lapo.it/asn1js/";!

and the result is as following:

305A300D06092A864886F70D01010105000349003046024100D18A48C06056273298E43FB443F2B9F6A275F0421707D84E9C622919F6E5FBDA496E4285B11AE31A1B247B0FCD5F9E3DC11C7C2606A72888ED872DC7B52ADB0F020111


SEQUENCE
Offset: 0
Length: 2+90
(constructed)

SEQUENCE
Offset: 2
Length: 2+13
(constructed)

OBJECT_IDENTIFIER
Offset: 4
Length: 2+9
Value:
1.2.840.113549.1.1.1

NULL
Offset: 15
Length: 2+0

BIT_STRING
Offset: 17
Length: 2+73
(encapsulates)

SEQUENCE
Offset: 20
Length: 2+70
(constructed)

INTEGER
Offset: 22
Length: 2+65

INTEGER
Offset: 89
Length: 2+1
Value:
17


Regarding this result,I found that should zero "n" and "e" in this
way:

For "n":

INTEGER
Offset: 22
Length: 2+65

For "e":

INTEGER
Offset: 89
Length: 2+1
Value:
17


byte pubkey[] =

{0x30,0x5A,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
0x01,0x01,0x01,0x05,0x00,0x03,0x49,0x00,0x30,0x46,
0x02,0x41,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                0x00,
                0x02,0x01,0x00};

But when I run my program,I see "run_time" error which is thrown to
this line of "cryptlib.h" file:


virtual void ThrowIfInvalid(RandomNumberGenerator &rng, unsigned int
level) const
{if (!Validate(rng, level)) throw InvalidMaterial("CryptoMaterial:
this object contains invalid values");}

Related to this line of the code:

StringSource( message, true, new Redirector(*verifierFilter));



Here is the code:

#include "stdafx.h"

#include "rsa.h"
#include "osrng.h"   // PRNG
#include "hex.h"     // Hex Encoder/Decoder
#include "files.h"   // File Source and Sink
using namespace std;
using namespace CryptoPP;
int main(int argc, char* argv[])
{
      /*byte pubkey[] ={0x30,0x5A,0x30,0x0D,0x06,0x09,0x2A,0x86,
                0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x49,0x00,
                0x30,0x46,0x02,0x41,0x00,0xD1,0x8A,0x48,0xC0,0x60,0x56,0x27,
                0x32,0x98,0xE4,0x3F,0xB4,0x43,0xF2,0xB9,0xF6,0xA2,0x75,0xF0,
                0x42,0x17,0x07,0xD8,0x4E,0x9C,0x62,0x29,0x19,0xF6,0xE5,0xFB,
                0xDA,0x49,0x6E,0x42,0x85,0xB1,0x1A,0xE3,0x1A,0x1B,0x24,0x7B,
                0x0F,0xCD,0x5F,0x9E,0x3D,0xC1,0x1C,0x7C,0x26,0x06,0xA7,0x28,
                0x88,0xED,0x87,0x2D,0xC7,0xB5,0x2A,0xDB,0x0F,0x02,0x01,0x11};*/

        byte pubkey[] ={0x30,0x5A,0x30,0x0D,0x06,0x09,0x2A,0x86,
                0x48,0x86,0xF7,0x0D,
0x01,0x01,0x01,0x05,0x00,0x03,0x49,0x00,0x30,0x46,
                0x02,0x41,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                0x00,
                0x02,0x01,0x00};

           byte pbSignature[]= {0x17,0x26,0xA8,0x4F,0x87,0x9D,0x9D,0x3F,0x60,
                0x98,0x92,0x75,0x3E,0xB2,0xF4,0x8B,0xA6,0xF6,0x47,0x09,0x71,
                0xBD,0x5D,0x87,0x9E,0x52,0xED,0xB0,0x23,0x2D,0xA3,0xCE,0x43,
                0xEE,0xD2,0xEC,0xD3,0x17,0x55,0x3A,0x37,0xCA,0x17,0xF7,0x2B,
                0xB5,0x41,0x0C,0xA9,0x48,0x69,0x89,0xA6,0x72,0xB5,0x4F,0xB7,
                0xD0,0x20,0xCC,0x2C,0x0E,0x1E,0x39};


// Message M
string message = "Yoda said, Do or Do Not. There is not try.";

//Verify signature
StringSource pubArray(pubkey,sizeof(pubkey), true,NULL);

StringSource SignatureArray( pbSignature,sizeof
(pbSignature),true,NULL);

// Verifier Object
RSASSA_PKCS1v15_SHA_Verifier pub(pubArray);

// Sanity Check
if (SignatureArray.MaxRetrievable() != pub.SignatureLength())
   printf("error length:%d",(int)pub.SignatureLength());

SecByteBlock Signature( pub.SignatureLength() );
SignatureArray.Get( Signature, Signature.size());

// Prepare Verifier
VerifierFilter *verifierFilter =new VerifierFilter(pub);
verifierFilter->Put(Signature, pub.SignatureLength());

// Invoke Verifier
StringSource( message, true, new Redirector(*verifierFilter));

// Paydirt
if( false == verifierFilter->GetLastResult() )
       printf("Signature Verification Failed");
else
       printf("Signature Verified");

   return 0;
}



And also when running, the value of "pub.SignatureLength()" is "1" !!!


Please help me about this problem?!!

How Could I zero the "n" & "e" parts as works?

And How about zeroing the Private Key? ("n" & "e" & "d" & "p" &
"q" ,...)


Thanks in Advance.
Gary
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the "Crypto++ Users" 
Google Group.
To unsubscribe, send an email to [email protected].
More information about Crypto++ and this group is available at 
http://www.cryptopp.com.
-~----------~----~----~----~------~----~------~--~---

Reply via email to