Visual Basic Stats:

How to support the site


Site Wide Message: (current site time 8/1/2010 1:05:42 AM EDT)
  • We want your input! One of our sponsors wants to know your opinion about development related issues. Click here to tell us what you think.
  • Are you an emerging/young developer (aged 18-30)? If so, would you like the chance to affect future developer tools and products?
    If so, then click here to give your feedback.
 

Fast 64bit RSA Encryption Algorithm

Print
Email
winzip icon
Submitted on: 3/22/2000
By: William Gerard Griffiths (Author)  
Level: Advanced
User Rating: By 8 Users
Compatibility:VB 4.0 (32-bit), VB 5.0, VB 6.0

Users have accessed this code  12409 times.
 
 
     The famous rsa public key encryption algorithm, this code is based on the original design by: Asgeir Bjarni Ingvarsson. Now includes source code and zip file with working example.
 

Windows API/Global Declarations:

Can't Copy and Paste this?
Click here for a copy-and-paste friendly version of this code!
'**************************************
'Windows API/Global Declarations for :Fast 64bit RSA Encryption Algorithm
'**************************************
Public key(1 To 3) As Double
Public p As Double, q As Double
Public PHI As Double
Public Sub keyGen()
'Generates the keys for E, D and N
Dim E#, D#, N#
Const PQ_UP As Integer = 9999 'set upper limit of random number
Const PQ_LW As Integer = 3170 'set lower limit of random number
Const KEY_LOWER_LIMIT As Long = 10000000 'set for 64bit minimum
p = 0: q = 0
Randomize
Do Until D > KEY_LOWER_LIMIT 'makes sure keys are 64bit minimum
Do Until IsPrime(p) And IsPrime(q) ' make sure q and q are primes
p = Int((PQ_UP - PQ_LW + 1) * Rnd + PQ_LW)
q = Int((PQ_UP - PQ_LW + 1) * Rnd + PQ_LW)
Loop
 N = p * q
 PHI = (p - 1) * (q - 1)
 E = GCD(PHI)
 D = Euler(E, PHI)
Loop
 key(1) = E
 key(2) = D
 key(3) = N
 
End Sub
Private Function Euler(E3 As Double, PHI3 As Double) As Double
'genetates D from (E and PHI) using the Euler algorithm
On Error Resume Next
Dim u1#, u2#, u3#, v1#, v2#, v3#, q#
Dim t1#, t2#, t3#, z#, uu#, vv#, inverse#
u1 = 1
u2 = 0
u3 = PHI3
v1 = 0
v2 = 1
v3 = E3
Do Until (v3 = 0)
 q = Int(u3 / v3)
 t1 = u1 - q * v1
 t2 = u2 - q * v2
 t3 = u3 - q * v3
 u1 = v1
 u2 = v2
 u3 = v3
 v1 = t1
 v2 = t2
 v3 = t3
 z = 1
Loop
uu = u1
vv = u2
If (vv < 0) Then
inverse = vv + PHI3
Else
 inverse = vv
End If
Euler = inverse
End Function
Private Function GCD(nPHI As Double) As Double
'generates a random number relatively prime to PHI
On Error Resume Next
Dim nE#, y#
Const N_UP = 99999999 'set upper limit of random number for E
Const N_LW = 10000000 'set lower limit of random number for E
Randomize
nE = Int((N_UP - N_LW + 1) * Rnd + N_LW)
top:
 x = nPHI Mod nE
 y = x Mod nE
 If y <> 0 And IsPrime(nE) Then
 GCD = nE
 Exit Function
 Else
 nE = nE + 1
 End If
 
 GoTo top
End Function
Private Function IsPrime(lngNumber As Double) As Boolean
'Returns 'True' if lngNumber is a prime
 
On Error Resume Next
Dim lngCount#
Dim lngSqr#
Dim x#
lngSqr = Int(Sqr(lngNumber)) ' Get the int square root
 If lngNumber < 2 Then
 IsPrime = False
 Exit Function
 End If
 lngCount = 2
 IsPrime = True
 If lngNumber Mod lngCount = 0 Then
 IsPrime = False
 Exit Function
 End If
 lngCount = 3
 For x = lngCount To lngSqr Step 2
 If lngNumber Mod x = 0 Then
IsPrime = False
Exit Function
 End If
 Next
End Function
Public Function Mult(ByVal x As Double, ByVal p As Double, ByVal m As Double) As Double
'encrypts, decrypts values passed to the function.. e.g.
'Mult = M^E mod N (encrypt) where M = x , E = p, N = m
'Mult = M^D mod N (decrypt)
On Error GoTo error1
 
y = 1
 
 Do While p > 0
 Do While (p / 2) = Int((p / 2))
x = nMod((x * x), m)
p = p / 2
 Loop
 y = nMod((x * y), m)
 p = p - 1
 Loop
 Mult = y
 Exit Function
error1:
y = 0
End Function
Private Function nMod(x As Double, y As Double) As Double
'this function replaces the Mod command. instead of z = x Mod y
'it is now z = nMod(x,y)
On Error Resume Next
Dim z#
z = x - (Int(x / y) * y)
nMod = z
End Function
Public Function enc(tIp As String, eE As Double, eN As Double) As String
'returns the long value of the characters, chained with a +
'e.g. 12345678+23456789+ etc..
'**Taken out encryption algorithm to simplify program**
On Error Resume Next
Dim encSt As String
encSt = ""
e2st = ""
 
 If tIp = "" Then Exit Function
 For i = 1 To Len(tIp)
 encSt = encSt & Mult(CLng(Asc(Mid(tIp, i, 1))), eE, eN) & "+"
 Next i
'** put your encryption algorithm code here **
enc = encSt
 
End Function
Public Function dec(tIp As String, dD As Double, dN As Double) As String
'returns the characters from the long values
'e.g A = 12345678, B = 23456789 etc..
'**Taken out decryption algorithm to simplify program**
On Error Resume Next
Dim decSt As String
decSt = ""
'** put your decryption algorithm code here **
For z = 1 To Len(tIp)
 ptr = InStr(z, tIp, "+")
 tok = Val(Mid(tIp, z, ptr))
 decSt = decSt + Chr(Mult(tok, dD, dN))
 z = ptr
Next z
dec = decSt
End Function
winzip iconDownload code

Note: Due to the size or complexity of this submission, the author has submitted it as a .zip file to shorten your download time. Afterdownloading it, you will need a program like Winzip to decompress it.Virus note:All files are scanned once-a-day by Planet Source Code for viruses, but new viruses come out every day, so no prevention program can catch 100% of them. For your own safety, please:
  1. Re-scan downloaded files using your personal virus checker before using it.
  2. NEVER, EVER run compiled files (.exe's, .ocx's, .dll's etc.)--only run source code.
  3. Scan the source code with Minnow's Project Scanner

If you don't have a virus scanner, you can get one at many places on the net including:McAfee.com

 
Terms of Agreement:   
By using this code, you agree to the following terms...   
  1. You may use this code in your own programs (and may compile it into a program and distribute it in compiled format for languages that allow it) freely and with no charge.
  2. You MAY NOT redistribute this code (for example to a web site) without written permission from the original author. Failure to do so is a violation of copyright laws.   
  3. You may link to this code from another website, but ONLY if it is not wrapped in a frame. 
  4. You will abide by any additional copyright restrictions which the author may have placed in the code or code's description.


Other 3 submission(s) by this author

 

 
 Report Bad Submission
Use this form to notify us if this entry should be deleted (i.e contains no code, is a virus, etc.).
This submission should be removed because:
 
Your Vote!

What do you think of this code(in the Advanced category)?
(The code with your highest vote will win this month's coding contest!)
Excellent  Good  Average  Below Average  Poor See Voting Log
 
Other User Comments
3/22/2000 8:58:07 PMphYro

i'd really like to know what you did to modify this code??? incase you didn't notice it has already been submitted!
(If this comment was disrespectful, please report it.)

 
3/23/2000 11:31:39 PMencipher

The code that I submitted was similar to the original RSA encryption by Asgeir Bjarni Ingvarsson.
the original problem was that Asgeir's code would not exceed 40bit modulus for the keys,
I re-wrote this code and tidied it up and managed to increase the modulus of the keys to 64bit


(If this comment was disrespectful, please report it.)

 
7/1/2000 5:23:57 PMhi

hi
saw your encryption software and was
wondering wether you would be
interested in some work.if so
email at freshjada@hotmail.com

thanks

(If this comment was disrespectful, please report it.)

 
12/11/2000 11:33:07 AMjames hardacre

'** put your decryption algorithm code here **

I thought the encryption was already built in?

(If this comment was disrespectful, please report it.)

 
7/20/2001 6:46:59 PMgridrun

yes. wher's the decryption algo?? thanks =D
(If this comment was disrespectful, please report it.)

 
8/28/2002 6:13:43 PMDanny Cain

This is cool, is it alright if I use it in a program im writing?
(If this comment was disrespectful, please report it.)

 
8/31/2002 5:57:41 PMDanny Cain

Ive been looking at this and I think its actually possible to decipher the Ciphertext without knowing d, p or q :s
(If this comment was disrespectful, please report it.)

 
6/13/2003 12:15:35 AMSimon J Smith

I think any encryption that more than triples the size of the original string is not good. I have done a bit of this, and although it may be hard to decrypt, it is not practical to use unless you are dealing with small strings. Anyways, good work.
(If this comment was disrespectful, please report it.)

 
6/27/2003 3:03:08 PMDucch

For some reason I dont think the result your program output are the results RSA encryption shall output.
And about the
(If this comment was disrespectful, please report it.)

 
7/19/2003 7:06:35 AM

This RSA implementation is extremely insecure. You can factor the modulus by dividing n by everey possible prime p.
(If this comment was disrespectful, please report it.)

 
9/7/2003 8:10:19 AM

To crack this algo, I don't need to know the private key. All i need to do is to encrypt char(0) to char(255) using the public key and remap the encrypted string with the results. It might be more secure if you encrypt maybe 2 or 3 bytes together.
(If this comment was disrespectful, please report it.)

 
1/2/2006 1:45:58 PMJanc


(If this comment was disrespectful, please report it.)

 
1/2/2006 1:50:36 PMJanc

This example is working good but when i try some other values i have problem. Try this:
Mult("35b9a3cb", "11", "5518f65d") expected "528C41E5"
and backwards:
Mult("528C41E5","2309cd31","5518f65d")
expected "35B9A3CB" - original

but i get out others values, can you checkit ?
(If this comment was disrespectful, please report it.)

 
2/25/2006 4:01:03 PMAndrew M. Goncharov

crypting by 1 character is extremely insecure (IMHO), seriously simplifies crack through 'automated' brute-force comparison...
In my projects, I use CryptoAPIs only.
(If this comment was disrespectful, please report it.)

 
4/27/2006 4:30:55 AMChad Gutowsky

Clean code, whoever it is somewhat weak. What can you do on the rotaions for SkipJack? ^O^
(If this comment was disrespectful, please report it.)

 
Add Your Feedback!

Note:Not only will your feedback be posted, but an email will be sent to the code's author from the email account you registered on the site, so you can correspond directly.

NOTICE: The author of this code has been kind enough to share it with you.  If you have a criticism, please state it politely or it will be deleted.

For feedback not related to this particular code, please click here.
 
To post feedback, first please login.