RSA cipher module

Share your advanced PureBasic knowledge/code with the community.
User avatar
Crusiatus Black
Enthusiast
Enthusiast
Posts: 389
Joined: Mon May 12, 2008 1:25 pm
Location: The Netherlands
Contact:

Re: RSA cipher module

Post by Crusiatus Black »

I actually used the ISAAC CRPNG algorithm seeded by the systems CPRNG via OpenCryptRandom to calculate random numbers for key generation. In the software I'm implementing this in, I actually allow the user to set an additional seed source (for example, ambient audio).
Keya wrote:ahhh I think i get it now, thankyou wilbert!

Code: Select all

 Protected.RSAKeyPair K
...
 ShowMemoryViewer(K\SecretExponent, BigInt::NumberSize(K\SecretExponent))   ;e
 ;ShowMemoryViewer(K\Modulus, BigInt::NumberSize(K\Modulus))                ;n
 ;ShowMemoryViewer(K\PublicExponent, BigInt::NumberSize(K\PublicExponent))  ;d
@coco2 we should be using PB's CryptRandom() instead of Random() for this! :)
It was super easy to switch over and speed seems the same:
- add OpenCryptRandom() at start and CloseCryptRandom() after use
- text-replace the two RandomData() calls to CryptRandomData()
- text-replace the one Random() call to CryptRandom()
(CryptRandom() doesnt support the Minimum parameter like Random() does, but thats ok for this because youre only using the Maximum parameter which they both support)
Image
Bas Groothedde,
Imagine Programming

I live in a philosophical paradoxal randome filled with enigma's!
User avatar
Keya
Addict
Addict
Posts: 1890
Joined: Thu Jun 04, 2015 7:10 am

Re: RSA cipher module

Post by Keya »

I have broken down coco's code into three components (keygen, encrypter, decrypter) independent of each other to help get my head around this fascinating algorithm :) its mainly based on coco's SelfTest() routine which demonstrates the full process.
Thanks again to coco and wilbert for some awesome code!!!

Keygen (Alice) - saves the three key components:

Code: Select all

IncludeFile("cc2rsa.pbi")

Procedure RSASaveKeys(SavePath.s, *K.Cc2RSA::RSAKeyPair)
  hFile = CreateFile(#PB_Any, SavePath+"rsakey-e-pub.dat") ;Public-only
  If hFile
    WriteData(hFile, *K\PublicExponent, BigInt::NumberSize(*K\PublicExponent))
    CloseFile(hFile)
  EndIf
  hFile = CreateFile(#PB_Any, SavePath+"rsakey-n-pub.dat") ;Public/shared
  If hFile
    WriteData(hFile, *K\Modulus, BigInt::NumberSize(*K\Modulus))
    CloseFile(hFile)
  EndIf
  hFile = CreateFile(#PB_Any, SavePath+"rsakey-d-prv.dat") ;Private-only
  If hFile
    WriteData(hFile, *K\SecretExponent, BigInt::NumberSize(*K\SecretExponent))
    CloseFile(hFile)
  EndIf  
EndProcedure

Procedure GenerateAndSaveKeys(KeyPath.s)
  Protected.Cc2RSA::RSAKeyPair K
  Protected.BigInt::BigInt data1, data2
  If Cc2RSA::GenerateKeyPair(K)
    Debug "e: " + BigInt::GetHex(K\PublicExponent)   
    Debug "n: " + BigInt::GetHex(K\Modulus)
    Debug "d: " + BigInt::GetHex(K\SecretExponent)    
    RSASaveKeys(KeyPath, @K)
  Else
    Debug "GenerateKeyPair() failed"
  EndIf
EndProcedure

Define KeyPath.s = GetPathPart(ProgramFilename())
GenerateAndSaveKeys(KeyPath)
Debug "DONE. Saved to " + KeyPath
Encrypter (Bob) - reads the public key and shared modulus, and encrypts a buffer which it saves to a file:

Code: Select all

IncludeFile("cc2rsa.pbi")

Procedure LoadPublicKey(KeyPath.s, *K.Cc2RSA::RSAKeyPair)
  *tmpbuf = AllocateMemory($10000)
  hFile = ReadFile(#PB_Any, KeyPath+"rsakey-n-pub.dat")
  If hFile
    *K\KeySize = Lof(hFile)*8              ;set keysize (eg. 1024, 2048, 4096)
    If *K\KeySize % 512 <> 0: MessageRequester("WARNING", "Keysize not multiple of 512"): EndIf
    ReadData(hFile, *tmpbuf, Lof(hFile))
    BigInt::LoadValue(*k\Modulus, *tmpbuf, Lof(hFile))
    CloseFile(hFile)
  EndIf
  hFile = ReadFile(#PB_Any, KeyPath+"rsakey-e-pub.dat")
  If hFile
    ReadData(hFile, *tmpbuf, Lof(hFile))
    BigInt::LoadValue(*k\PublicExponent, *tmpbuf, Lof(hFile))
    CloseFile(hFile)
  EndIf
  FreeMemory(*tmpbuf)
EndProcedure

Procedure RSAEncrypt(*K.Cc2RSA::RSAKeyPair, *data, datalen.i, *dataout.BigInt::BigInt)
 Protected.BigInt::BigInt data1
 BigInt::LoadValue(data1, *data, datalen)
 If Cc2RSA::RSAProcessRaw(*dataout, data1, *K)
   Debug "RSAProcessRaw SUCCESS"
 Else
   Debug "RSAProcessRaw FAIL"
 EndIf
EndProcedure

Procedure SaveBigInt(*bigint.BigInt::BigInt, sFile.s)
  hFile = CreateFile(#PB_Any, sFile)
  If hFile
    WriteData(hFile, *bigint, BigInt::NumberSize(*bigint))
    CloseFile(hFile)
  EndIf  
EndProcedure
    
Define KeyPath.s = GetPathPart(ProgramFilename())
Define K.Cc2RSA::RSAKeyPair
Define encdata.BigInt::BigInt
LoadPublicKey(KeyPath, @K)
Debug "n: " + BigInt::GetHex(K\Modulus)
Debug "e: " + BigInt::GetHex(K\PublicExponent)

Debug "Encrypting..."
sMsg.s = "secret!"
RSAEncrypt(K, @sMsg, Len(sMsg), encdata)
SaveBigInt(encdata, KeyPath+"rsa-encrypted.dat")
Decrypter (Alice) - reads private key and shared modulus, reads the encrypted buffer from file, and decrypts it:

Code: Select all

IncludeFile("cc2rsa.pbi")

Procedure LoadPrivateKey(KeyPath.s, *K.Cc2RSA::RSAKeyPair)
  *tmpbuf = AllocateMemory($10000)
  hFile = ReadFile(#PB_Any, KeyPath+"rsakey-n-pub.dat")
  If hFile
    *K\KeySize = Lof(hFile)*8              ;set keysize (eg. 1024, 2048, 4096)
    If *K\KeySize % 512 <> 0: MessageRequester("WARNING", "Keysize not multiple of 512"): EndIf
    ReadData(hFile, *tmpbuf, Lof(hFile))
    BigInt::LoadValue(*k\Modulus, *tmpbuf, Lof(hFile))
    CloseFile(hFile)
  EndIf
  hFile = ReadFile(#PB_Any, KeyPath+"rsakey-d-prv.dat")
  If hFile
    ReadData(hFile, *tmpbuf, Lof(hFile))
    BigInt::LoadValue(*k\SecretExponent, *tmpbuf, Lof(hFile))
    CloseFile(hFile)
  EndIf
  FreeMemory(*tmpbuf)
EndProcedure

Procedure RSADecrypt(*K.Cc2RSA::RSAKeyPair, *data, datalen.i, *dataout.BigInt::BigInt)
 Protected.BigInt::BigInt data1
 BigInt::LoadValue(data1, *data, datalen)
 If Cc2RSA::RSAProcessRaw(*dataout, data1, *K, 1)
   Debug "RSAProcessRaw SUCCESS"
 Else
   Debug "RSAProcessRaw FAIL"
 EndIf
EndProcedure

Procedure SaveBigInt(*bigint.BigInt::BigInt, sFile.s)
  hFile = CreateFile(#PB_Any, sFile)
  If hFile
    WriteData(hFile, *bigint, BigInt::NumberSize(*bigint))
    CloseFile(hFile)
  EndIf  
EndProcedure
  
Define KeyPath.s = GetPathPart(ProgramFilename())
Define K.Cc2RSA::RSAKeyPair
Define encdata.BigInt::BigInt
LoadPrivateKey(KeyPath, @K)
Debug "n: " + BigInt::GetHex(K\Modulus)
Debug "d: " + BigInt::GetHex(K\SecretExponent)

hFile = ReadFile(#PB_Any, KeyPath+"rsa-encrypted.dat")
If hFile
  buflen = Lof(hFile)
  *buf = AllocateMemory(buflen)
  ReadData(hFile, *buf, buflen)
  BigInt::LoadValue(encdata, *buf, buflen)
  CloseFile(hFile)
  
  Debug "Decrypting..."  
  RSADecrypt(K, *buf, buflen, encdata)
  ShowMemoryViewer(encdata, BigInt::NumberSize(encdata))
Else
  Debug "Couldnt read rsa-encrypted.dat"
EndIf
User avatar
Keya
Addict
Addict
Posts: 1890
Joined: Thu Jun 04, 2015 7:10 am

Re: RSA cipher module

Post by Keya »

From http://www.cypherspace.org/rsa/pureperl.html ... RSA in 5 lines of Perl:

Code: Select all

#!/usr/local/bin/perl -s do 'bigint.pl';($_,$n)=@ARGV;s/^.(..)*$/0$&/;($k=unpack('B*',pack('H*',$_)))=~ 
s/^0*//;$x=0;$z=$n=~s/./$x=&badd(&bmul($x,16),hex$&)/ge;while(read(STDIN,$_,$w 
=((2*$d-1+$z)&~1)/2)){$r=1;$_=substr($_."\0"x$w,$c=0,$w);s/.|\n/$c=&badd(&bmul 
($c,256),ord$&)/ge;$_=$k;s/./$r=&bmod(&bmul($r,$r),$x),$&?$r=&bmod(&bmul($r,$c ),$x):0,""/ge;($r,$t)=&bdiv($r,256),$_=pack(C,$t).$_while$w--+1-2*$d;print}
See also http://c2.com/cgi/wiki?ProgrammingLanguageQuotes
Perl - The only language that looks the same before and after RSA encryption. -- Keith Bostic
god damn I ♥ basic syntax lol

Well, if that perl code can use 'bigint.pl' then I can use wilbert's BigIntSSE2.pbi.
I therefore present RSA IN 3 LINES OF PUREBASIC: (heavily and almost unashamedly stolen from coco2's code lol)

Code: Select all

IncludeFile("bigintsse2.pbi")
Define decdata.BigInt::BigInt, encdata.BigInt::BigInt, rsa_d.BigInt::BigInt, rsa_n.BigInt::BigInt
BigInt::ModPow(decdata, encdata, rsa_d, rsa_n)
coco2
Enthusiast
Enthusiast
Posts: 461
Joined: Mon Nov 25, 2013 5:38 am
Location: Australia

Re: RSA cipher module

Post by coco2 »

I updated the module to use CryptRandom and CryptRandomData. My next project is a PKCS #1 implementation, but I don't get to program much lately so it could be a while away.
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: RSA cipher module

Post by walbus »

@coco2
Great work, many thanks for sharing

@wilbert
Also many thanks for sharing the very cool big int module

@keya
Your last procedures was a very good and helpfull idea for demonstrate simple using
Last edited by walbus on Wed Jul 13, 2016 3:31 pm, edited 1 time in total.
User avatar
Keya
Addict
Addict
Posts: 1890
Joined: Thu Jun 04, 2015 7:10 am

Re: RSA cipher module

Post by Keya »

walbus i just find it much easier to get my stupid head around these things when they're physically separated into Alice.pb and Bob.pb programs rather than all in one :)
Image
https://en.wikipedia.org/wiki/Alice_and_Bob

hey i have an RSA question - if I want to do "reverse RSA" is that ok? like, if i want the public to be able to decrypt my message but only i can encrypt, is that ok? does it matter WHICH of the two large keys i give the public, or does the only thing that matters is that i only give them 1? (can i give them the private key and keep the public key to myself?) hope my Q makes sense :)
Last edited by Keya on Mon Jul 18, 2016 12:09 am, edited 1 time in total.
coco2
Enthusiast
Enthusiast
Posts: 461
Joined: Mon Nov 25, 2013 5:38 am
Location: Australia

Re: RSA cipher module

Post by coco2 »

Hi Keya
I read somewhere that's how message signing is done although I've never done it. You can reverse the keys by putting a 1 in the parameters like so:

Code: Select all

RSAProcessRaw(data2, data1, K, 1)
Maybe someone with more RSA knowledge (I am just learning, that's why I decided to write this from scratch) could explain how to do it.
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: RSA cipher module

Post by walbus »

I have ready a complete include with a GUI for using RSA easy in any software.
All works very fine.
Now, i will optimize some things.
I want a perfect thing, how anybody will help for optimizing, that would very helpfull ?
Last edited by walbus on Thu Sep 15, 2016 8:07 am, edited 1 time in total.
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3942
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: RSA cipher module

Post by wilbert »

walbus wrote:I want a perfect thing, how anybody will help for optimizing, that would very helpfull ?
My BigInt module was created with both x86 and x64 support in mind.
You could improve a on its performance by dropping x86 support and rewriting the procedures with 64 bit asm only.
The Multiply procedure for example currently uses PMULUDQ to multiply. As far as I understand, the MUL procedure has a little less latency compared to PMULUDQ but using SSE is often very useful for x86 since it has so little general purpose registers. When developing for 64 bit only, you can make use of all the additional registers it offers.
Windows (x64)
Raspberry Pi OS (Arm64)
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: RSA cipher module

Post by walbus »

Many thanks wilbert.
User avatar
Maxus
User
User
Posts: 71
Joined: Thu Feb 16, 2006 9:35 am
Location: Russia
Contact:

Re: RSA cipher module

Post by Maxus »

Code: Select all

Self test
Generating 4096 bit key pair...
e: 10001
n: 5E62EAF7F356027C35084EF5912BE2F916721B7C7403D6ABD5C12EF15E6FF8DC0887B462890654F16F8F0E2B96F1FC636C53B2C5236377B17B0403D02CD306925259DFE271375E510B929D4592F485A5A6CC2DAB386805CD8F86685FF4C586E61C02AD6A89D7D56A68A56EAA73E5521DC419D79E8BE70BBE76FF58EDFDC2FB574D4281307F4BFAD428AEA3FD872D640EFA6BBE659C4D420FFC1B590A24979D5DE1594C8A62921E66D04940A0BDE77CD5D074C6ACA61A52806F7EFBD29B6DA3C4B7A02243CFF662C43DDE8F0DDB57FA84116A53E17D403D7805DB547704BD89700FF04BC66063268C0B3C44C4EF8FACC41EB74AC8BA12E018857BA9449B32052AB4850D82810F272A7A0C1FE67815DED467460CBB2B3AB134658AB23BD3B88F3D9AE577E63391D0934F238513172DE13F76858F4D1630049368976EEA229A4F978565F987380AE90C5919C11F359A42E50F5BB24D8C21E9AD5C3C3FFB3D3D7CD8A28AAAEF1E4E0B520E6F5F55D7298850656738B85432DF54D0AC17EDCC68F0D15222F72B303621605CE89BA1D93ECDA07D710CFE58229BBDF80364D64E33C33C20AAC86FA7DDD5ED076D18A06938D325F27BB9BAD033D2F2BF3069DF8A27A0A3882E2B37C528E96896A9220E98A6D61514B1972940E4BB6D571AE3B36B51525C3199908CDAD2C25A0A5C4B50FB6203D1E2D6F1B134C5B60D789B48A920DFB26F
d: 13A1FFBE139F9064C5A334C95FA9014D4E9DED99B58816DF275747AC6D385D4B677AD2CAAC35E4F5537F2E3362F272CD3B7B2D7454281C7D8E59077205E0DF3D1064216DB89F0BBF4FE8EF4DC983934921A8D6D706A49C90658A4FABA5FE7050ED02A18FC79C5D8804BC64889012E341CDC892512848A6E8B757E5E79B2133A6B52B6033F64697A609D049CC3291FE7E1F18CA41D881397C99B41691458B43F0832F4FFC79046BCE7704C5ACA9D3BCE3BCB88D9ADBF21DB7197A10677E6D0FE39B4E73D2272FD8DB7903123E8FA17D3A7B64E28DC4BFD8095F2E802341992B3D641357AFABDCF3E7AD6E9BDF5AF547BA83A91CA5240F490DD0B6283F5D08CA8A130BB3EEC7C6BCD7B8D2D4A6CD7B0A48AA7A6767BD1FD904E46155B5ED6415796218A92192308B86510CD8E009F6B939873D6EE28CFAF2DFDC82605FD03F499EAA98ACD12EABD427E882D9E844DEF3B6762F28952DF070D188D3A7C8C9EA0A7EF3164CCFC9D0C2D61B26B4FE42A8F5205DD6BD362C847F71F88D87EC2928A0484835850B0DEB157D71A0C6F358BEF30CA5AFE0C867094C00F8BBF3461847272993EE3FC55C420E791657C282349AD6A7E3C1B7CEBF4CF19C413A480D1C29772000B3990CCE174FDDCCC81300DBB3D90CB0618CA8676C6A4A42EE75565839608BCC278B88BFE8D30F0EA3A4F02389E9D17AC9BB18D94137C21B4C5975282B0A01
Key generation time: 11790 ms
e: 10001
n: 5E62EAF7F356027C35084EF5912BE2F916721B7C7403D6ABD5C12EF15E6FF8DC0887B462890654F16F8F0E2B96F1FC636C53B2C5236377B17B0403D02CD306925259DFE271375E510B929D4592F485A5A6CC2DAB386805CD8F86685FF4C586E61C02AD6A89D7D56A68A56EAA73E5521DC419D79E8BE70BBE76FF58EDFDC2FB574D4281307F4BFAD428AEA3FD872D640EFA6BBE659C4D420FFC1B590A24979D5DE1594C8A62921E66D04940A0BDE77CD5D074C6ACA61A52806F7EFBD29B6DA3C4B7A02243CFF662C43DDE8F0DDB57FA84116A53E17D403D7805DB547704BD89700FF04BC66063268C0B3C44C4EF8FACC41EB74AC8BA12E018857BA9449B32052AB4850D82810F272A7A0C1FE67815DED467460CBB2B3AB134658AB23BD3B88F3D9AE577E63391D0934F238513172DE13F76858F4D1630049368976EEA229A4F978565F987380AE90C5919C11F359A42E50F5BB24D8C21E9AD5C3C3FFB3D3D7CD8A28AAAEF1E4E0B520E6F5F55D7298850656738B85432DF54D0AC17EDCC68F0D15222F72B303621605CE89BA1D93ECDA07D710CFE58229BBDF80364D64E33C33C20AAC86FA7DDD5ED076D18A06938D325F27BB9BAD033D2F2BF3069DF8A27A0A3882E2B37C528E96896A9220E98A6D61514B1972940E4BB6D571AE3B36B51525C3199908CDAD2C25A0A5C4B50FB6203D1E2D6F1B134C5B60D789B48A920DFB26F
d: 13A1FFBE139F9064C5A334C95FA9014D4E9DED99B58816DF275747AC6D385D4B677AD2CAAC35E4F5537F2E3362F272CD3B7B2D7454281C7D8E59077205E0DF3D1064216DB89F0BBF4FE8EF4DC983934921A8D6D706A49C90658A4FABA5FE7050ED02A18FC79C5D8804BC64889012E341CDC892512848A6E8B757E5E79B2133A6B52B6033F64697A609D049CC3291FE7E1F18CA41D881397C99B41691458B43F0832F4FFC79046BCE7704C5ACA9D3BCE3BCB88D9ADBF21DB7197A10677E6D0FE39B4E73D2272FD8DB7903123E8FA17D3A7B64E28DC4BFD8095F2E802341992B3D641357AFABDCF3E7AD6E9BDF5AF547BA83A91CA5240F490DD0B6283F5D08CA8A130BB3EEC7C6BCD7B8D2D4A6CD7B0A48AA7A6767BD1FD904E46155B5ED6415796218A92192308B86510CD8E009F6B939873D6EE28CFAF2DFDC82605FD03F499EAA98ACD12EABD427E882D9E844DEF3B6762F28952DF070D188D3A7C8C9EA0A7EF3164CCFC9D0C2D61B26B4FE42A8F5205DD6BD362C847F71F88D87EC2928A0484835850B0DEB157D71A0C6F358BEF30CA5AFE0C867094C00F8BBF3461847272993EE3FC55C420E791657C282349AD6A7E3C1B7CEBF4CF19C413A480D1C29772000B3990CCE174FDDCCC81300DBB3D90CB0618CA8676C6A4A42EE75565839608BCC278B88BFE8D30F0EA3A4F02389E9D17AC9BB18D94137C21B4C5975282B0A01
Data: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Encrypting... internal
Total encrypt time: 2 ms
Encrypted data: 41BC82649C3994F8B8748A8BBD735A5B8F7CD5208EDF33E8BB3D41E073384F311D6D771A1BC76C09C07DF11E055692CF84AD83D70C681D8F8E7339A058EE610C39B61FDFCCCC7FF6D90A5CE4D832BA988F5B6BC96DBEDDAF43886DDDEFB077D472E28321F456C0BD84AA0C7B919A16E2181AA390B194A1C4D998D28FF74C2168D0B0861C34A06EBC47C1546EDEE7A3B6687796639805B12ACFC46C190C62ED40E0EE204F99B9102838AE692C1A9C5798314264C55BE1B5D0BCD96B629EF5395DFDB283B0109D068DAE9FE91BB4197D7E66726300C5E312172CBED07E045EE5BD3AA00F46E515FC949CCDC99FC6FB4BFDB35154162B234CC3C455C0412285A700EEA58CD37937183DC20B7854EA1DE326A6021A89D105AD74FBA17A9104452C8EF6ACDD064AC95F836803917E0F671DE34897091E443E04EDA0152514AA6DD42A52ECEC860A343201A00D9E76E742594992DF28826A69ED5D4CD903E8CC01E3B9F547FD960DF66C8ED274F776CF1F9C59202D935043AFFD6782FAAFFB5925F2C1E0D076D53375E2B40E1D3AB091418DFAADEC9047BA2012C7E94B1B3DADD15734A7E974A04F086F16E7587F2103EA86CDAC735027EA43322D7B036FB626C00FFDF5FE03648C23B227EDF2F036FFD909B8D43C0DB85661965F32C549F86F1F8B304027C44518D3F7B64FE5DCA95DF4A4EF3557148550427713A2C085463E7C7960
Encrypting... external
Total encrypt time: 0 ms
Encrypted data: 41BC82649C3994F8B8748A8BBD735A5B8F7CD5208EDF33E8BB3D41E073384F311D6D771A1BC76C09C07DF11E055692CF84AD83D70C681D8F8E7339A058EE610C39B61FDFCCCC7FF6D90A5CE4D832BA988F5B6BC96DBEDDAF43886DDDEFB077D472E28321F456C0BD84AA0C7B919A16E2181AA390B194A1C4D998D28FF74C2168D0B0861C34A06EBC47C1546EDEE7A3B6687796639805B12ACFC46C190C62ED40E0EE204F99B9102838AE692C1A9C5798314264C55BE1B5D0BCD96B629EF5395DFDB283B0109D068DAE9FE91BB4197D7E66726300C5E312172CBED07E045EE5BD3AA00F46E515FC949CCDC99FC6FB4BFDB35154162B234CC3C455C0412285A700EEA58CD37937183DC20B7854EA1DE326A6021A89D105AD74FBA17A9104452C8EF6ACDD064AC95F836803917E0F671DE34897091E443E04EDA0152514AA6DD42A52ECEC860A343201A00D9E76E742594992DF28826A69ED5D4CD903E8CC01E3B9F547FD960DF66C8ED274F776CF1F9C59202D935043AFFD6782FAAFFB5925F2C1E0D076D53375E2B40E1D3AB091418DFAADEC9047BA2012C7E94B1B3DADD15734A7E974A04F086F16E7587F2103EA86CDAC735027EA43322D7B036FB626C00FFDF5FE03648C23B227EDF2F036FFD909B8D43C0DB85661965F32C549F86F1F8B304027C44518D3F7B64FE5DCA95DF4A4EF3557148550427713A2C085463E7C7960
Decrypting...internal
Decrypted data: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Total decrypt time: 285 ms
Decrypting...external
Decrypted data: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Total decrypt time: 17 ms
To my regret, BigInt turned out to be very slow.
Here's the thing about GMP.lib

internal: BigInt module
external: gmp.lib
Sorry my English, I'm Russian
AMT Laboratory
Post Reply