Create your RSA::PublicKey manually, then use it to make your verifier object the PublicKey object supports creation from DER data (like you are doing), but you can also manually specify its parts too (exponent, etc)
On Jun 25, 3:27 pm, Gary <[email protected]> wrote: > 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. -~----------~----~----~----~------~----~------~--~---
