Exploring RSA Encryption

An explanation of how and why RSA encryption works, plus examples on how to use it for yourself.

In contrast to the cooperative preparations required for setting up private key encryption, such as secret-sharing and close coordination between sender and receiver, you can act entirely on your own to create and publish two numbers that enable anyone, using the RSA encryption formula, to send a private message to you through a public channel. The message becomes "First Class" e-mail, so to speak, as if sealed in an envelope. Using the two numbers you have published, anyone can scramble a message and send it to you. You are the only one who can unscramble it--not even the sender of the message can decrypt the ciphertext.

RSA Encryption

Named after its inventors, Ron Rivest, Adi Shamir and Leonard Adleman, RSA encryption transforms the number "char" into the number "cipher" with the formula

        cipher = char^e (mod n)

The numbers e and n are the two numbers you create and publish. They are your "public key." The number char can be simply the digital value of a block of ASCII characters. The formula says: multiply the number char by itself e times, then divide the result by the number n and save only the remainder. The remainder that we have called cipher is the encrypted representation of char.

The GNU Bc Compiler

Our test program for calculating RSA keys, rsakeys.Bc, is written for Philip A. Nelson's threaded code compiler, named Bc. A program written for Bc is well suited to this experimental work, because it can handle numbers of arbitrary size.

Setting Up RSA

To set up RSA encryption, the main thing you need is a table of prime numbers. Begin by selecting two prime numbers at random. When the rsakeys.bc program asks for p and q, give it the two primes you selected. Of course, any numbers can be used for practice. Primes, especially large primes, make it more difficult for an eavesdropper to decrypt your message.

Call the program with the command bc rsakeys.bc. After you enter the numbers p and q, the program asks for a random number to be used to start a search for keys. When the program finds a pair of keys, it prints out results and pauses for keyboard input. Enter a negative number to quit. Or, if you don't like the key pair offered, enter any positive number to continue the search for another pair of keys. The value that you enter, to continue or to stop, doesn't matter; only its sign is checked.

The search finds two numbers, e and d, such that their product, modulo the number (p-1)*(q-1), is 1. In other words, the numbers e and d are such that their product minus 1, e*d - 1, is an integer multiple of the number (p-1)*(q-1).

Example Key Search

Using small numbers for clarity, here are results of an example run:

        enter prime p: 47
        enter prime q: 71
        n =  p*q   = 3337
        (p-1)*(q-1) = 3220
        Guess a large value for public key e 
        then we can work down from there.
        enter trial public key e: 79
        trying e = 79
         Use private key d:
        1019
         Publish e:
        79
         and n:
        3337
        cipher = char^e (mod n)  char = cipher^d (mod n)
        enter any positive value to continue search for next e 

The output above was created by the following Bc program.

   
# rsakeys.bc: generate RSA keys
# these Bc routines are transliterations of
# the  C  routines found in Bruce Schneier's
# "Applied Crytography" Wiley, New York. 1994.
# ISBN 0-471-59756-2
# modexp: from page 200
define modexp(a, x, n) { # return a ^ x mod n
        auto r
        
        r = 1
        while ( x > 0 ) {
                if ( (x % 2) == 1 ) {
                        r = (r * a) % n
                }
                
                a = ( a * a ) % n
                x /= 2
        }
        return(r)
}
# extended Euclidean algorithm
# adapted from  C  routine on page 202 
define exteuclid(u, v) {
        auto q, tn
        u1 = 1
        u3 = u
        v1 = 0
        v3 = v
        
        while ( v3 > 0 ) {
                q = u3 / v3
                
                tn = u1 - v1 * q
                u1 = v1
                v1 = tn
                
                tn = u3 - v3 * q
                u3 = v3
                v3 = tn
        }
        
        u1out = u1
        u2out = ( u3 - u1 * u ) / v
        return(u3)
}
print "enter prime p: "; p = read() 
print "enter prime q: "; q = read()
n = p * q
phi = (p-1) * (q-1)
print " n =  p*q   = ", n
print "\n(p-1)*(q-1) = ", phi
        print "\nGuess a large value for public key e "
        print "\n then we can work down from there."
        print "\nenter trial public key e: "; e = read()
        while ( e > 0 ) {
                
                print "\ntrying e = ",e
                gcd = exteuclid(e,phi)
                d = u1out
                if ( gcd == 1 ) {
                        nextgcd = exteuclid(u1out,phi)
                        # print "nextgcd = ",nextgcd
                        if ( u1out == e ) {
                                # print "\nthat one works  "
                                print "\n\nUse private key d:\n",d
                                print "\n\n Publish e:\n",e,"\n and n:\n",n
                                print "\ncipher = char^e (mod n)"
                                print "  char = cipher^d (mod n)"
                                print "\nenter any positive value"
                                print " to continue search for next e "
                                go = read()
                                if (go < 0) { break }
                        }
                }
        e = e - 2       
        }
        print "\n"
halt
______________________

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Article content somewhat useful

Anonymous's picture

I found this article while researching RSA for a homework assignment. I found the article somewhat helpful. As a former programmer, it wasn't, but as a student it was worth a look. The soap opera was as bonus.

a b mod m

Anonymous's picture

Does anybody knows how to calculate a b mod m with large number (e.g. 256 bits) using a optimized algorithm that perform quick bit shifting operation which perform faster than computing a b mod m?

One time I found that article in the internet but I can't find it. Does anybody knows?.

how we can find out reminder

Anonymous's picture

how we can find out reminder of negative no. by rsaencryption.

Is

Kolojed's picture

RsA

dhar's picture

HOW CAN WE GENERATE DIFFERENT PRIME NUMBERS ON EACH EXECUTION SO AS TO GET DIFFERENT KEYS EACH TIME FOR SECURITY.. THEN FOR A BUFFER LIKE,
CHAR *BUF="SOME TEXT HERE"........., HOW TO FETCH EACH CHARACTER AND ENCRYPT FROM THIS BUFFER AND PLACE IT THAT POSITION ONLY.. PLZ HELP ME OUT.....

RSA with non-prime numbers

Anonymous's picture

This explanation is very much helpful in clearly understanding of RSA working .
But there is a question,if we intentionally take 'p' and 'q' as a long composite numbers(of 200 digit) ,then will it violate the basics of RSA algorithm?
or it will reduce the level of security?

with regards

it will fuck up! read some

Anonymous's picture

it will fuck up! read some number teory, about the subject. you will (sometimes) not be abel to generate keys, if you don't use primes, and even if you can generate the keys, the encryption will randomly blow up, so whole the algoritme, dosent work.

Re: Exploring RSA Encryption

Anonymous's picture

Nice article, I

Re: Exploring RSA Encryption

Anonymous's picture

My experience has been there are 2 types of people in contact with computational cryptography: 1) theoretical mathematicians and 2) practicing software developers. Both are required and valuable, but it is overly burdesome to make either become an expert in the nuances of the other's field. In other words, software developers are nearly always unavailable for a dissertation on number theory and mathematicians are nearly always unavailable for complete system architecture. Accordingly, it is appropriate that seperate articles are written for each audience, and this article is a perfect fit for software developers.

Link to Dan Boneh's Twenty Years of Attacks on the RSA Cryptosys

Anonymous's picture

With all the talk about Dan Boneh's paper, I figured it was a good idea to provide a link to it. Here is the reference via Cryptonomicon.Net.

Re: Exploring RSA Encryption

Anonymous's picture

I really like this article. It provided a basic overview to encryption that I was looking for. Obviously this is not the ultimate resource for becoming a guru in cryptology. It is a wonderful place to start.

Re: Exploring RSA Encryption

Anonymous's picture

Thank you for positive feedback

confirming validity of the original

intention.

CAUTION CAUTION CAUTION

To further aggravate reader risk with

more disgusting clarity, this irresponsible

author has now published yet another

dangerous dissertation dressed up as

a basic description of "unbreakable" ;-)

encryption, in the April 2003 issue

of "Nuts&Volts" magazine.

Jdennon@seasurf.com

Re: Exploring RSA Encryption

Anonymous's picture

I agree that this is a dangerous article. Now some people will think they know enough about RSA to use it in their programs. They DON'T.

And what about this: "Of course, any numbers can be used for practice. Primes, especially large primes, make it more difficult for an eavesdropper to decrypt your message."

This is nonsense. In general only primes will work, and all proofs about the RSA cryptosystem are based on the assumption that p and q are prime numbers. I would like to see a proof showing that the RSA cryptosystem works even if p and q are not primes :-)

Re: Exploring RSA Encryption

Anonymous's picture

You are an idiot. Don't trash other people's work if you know nothing about your subject. I can show you at least one proof of the RSA algorithm using non-primes so shut the ***** up.

Re: Exploring RSA Encryption

Anonymous's picture

Show me, don't just talk.

Re: Exploring RSA Encryption

Anonymous's picture

Show you what? Are you saying students
should not be encouraged to experiment?
The article shows students how to experiment.
Are you saying this is a bad idea?
What are you saying? Show you what?
Jack Dennon
jdennon@seasurf.com

Re: Exploring RSA Encryption

Anonymous's picture

Some earlier rather bazaar commentary--contributed by some who may be
in positions able to influence students--labeled my suggested simple method,
for experimenting with the RSA algorithm, as "dangerous." Perhaps the
present comment will help encourage students to go ahead and
experiment. So, thank you.
jdennon@seasurf.com

Re: Exploring RSA Encryption

Anonymous's picture

"Bazaar" also is a little bizarre, but
that's what you get for spelling
by ear.
jdennon@seasurf.com

Re: Exploring RSA Encryption

Anonymous's picture

Not exactly true.

p and q need NOT be prime, they need to be prime one to each other.

For example, 10 and 25 do not work, but 10 and 49 do ...

It remains true however that the original article made a false statement.

In particular you can not just use any binary sequence and use it as a p

or q ...

Re: Exploring RSA Encryption

Anonymous's picture

But the article did not say you can "use" them,

it said you can "practice" with them, as indeed

you can. You can practice with anything you

wish; the whole purpose of which would be

to find out for yourself what works and what

does not.

Re: Exploring RSA Encryption

Anonymous's picture

Yes, that's right. If he had said "any numbers can be

used for practice" and put a period on it, he may have

escaped unscathed; if by "practice" we mean experimenting

to discover what works, but he got a little too chatty and went

on to imply that any numbers work while some just work better

than others. That is indeed false.

Re: Exploring RSA Encryption

Anonymous's picture

Yes. If you read any of the canonical works on RSA, for example the RSA website, you will see that p and q are defined as being prime right at the outset. There are certain composite numbers that will work for this purpose, but there's no way to guarantee that there's no easy backdoor for them. In fact, the large primes used in "real" RSA are pseudo-prime, that is, they *may* be composite but exhibit enough primality to work. In other words, there may be divisors greater than one, but not very many (perhaps one or two).

Thanks

Anonymous's picture

despite the other postings...

I know nothing about security algorthms, but have been curious about how they work.

I, for one, appreciate the article both for what it has, and for what it doesn't.

Re: Exploring RSA Encryption

Anonymous's picture

Actually, this is a horrible article. Okay, you've explained the underlying math in a reasonably clear manner. However, you've given no guidance whatsoever for how to use RSA securely. If people start with this article and use it to implement, they probably won't. For details on the many, many things that can go wrong, see Dan Boneh's paper, "Twenty years of attacks on the RSA cryptosystem".

Then, there's no discussion of other practical issues, such as the fact that RSA is not something you'd ever want to use for general-purpose encryption. Not only are there massive efficiency issues, but also RSA is highly prone to dictionary-style attacks.

And then, he doesn't mention any of the more easily accessible RSA implementations, such as the one in OpenSSL.

This article reads like it is written by someone who didn't understand the math 2 weeks ago, learned it and wanted to solidify the knowledge by writing about it. That's all well and good, except you're doing a disservice to the rest of the world.

Re: Exploring RSA Encryption

Anonymous's picture

This article is good. It explains how RSA works, not how to implement it or use it securely for your own stuff. Once you know how it works, it's easier to read up on those.

Re: Exploring RSA Encryption

Anonymous's picture

It's fine for explaining the math, but is horrible at everything else. You can say that it's not intended to be more, but it's still highly irresponsible.

Why? Because you have to assume that people are going to read this article and go, "wow, now I can go add RSA to my system!" without doing a lick of additional research. Such people aren't going to go learn about the importance of the padding scheme, etc.

The math is not the thing that the average developer needs to know about RSA. It's only the "cool" thing.

Re: Exploring RSA Encryption

Anonymous's picture

Highly irresponsible?

So by your reasoning if there were to be an article published on "basic" kernel hacking that would also be irresponsible because now someone is going to go "wow, now I can go hack my kernel!" without doing a lick of additional research.

I think just plain silly.

If you are truly worried about people not having enough knowledge why not share some resources instead of just bitching about it?

Re: Exploring RSA Encryption

Anonymous's picture

No, this is not a "basic" topic. It's an advanced security topic dressed up like a basic topic. If you just follow the article, it will likely be a security disaster, and yet there are no such warnings. That's completely different from basic kernel hacking.

I *did* share resources, recommending the Dan Boneh paper.

In general, people who don't know anything about cryptography should be using high-level protocols instead of relying on articles like this, which will only lead to trouble.

If only people knew that.

Re: Exploring RSA Encryption

Anonymous's picture

Alright now buddy. Why don't you just pop a valium or two and find a different line of work? If you keep on ranting and raving like this it won't be long before you have a nervous breakdown.

on the advisability of getting rid of p and q

Anonymous's picture

Hey, this is a great article about RSA. It's accurate and accessable by the non-specialist. There is, however, one little nit-pic I'd offer. For at least a decade now, most commercial implementations of the RSA algorithm use a CRT (Chinese Remainder Theorem) based algorithm to decrypt RSA encrypted messages. This technique allows one to decrypt a message by using two modular exponentiations with numbers that are half the size of the original key. In order to use this optimization, however, one must keep p and q (not only n) as part of the private key.

There's a good explaination of the technique at: http://people.atips.ca/~walus/Mont/crtexp.html.

Re: on the advisability of getting rid of p and q

Anonymous's picture

Just hold onto the input file you create for the

key generator, then use it as input to the CRT.

BTW, in her 1939 book "Cryptanalysis," Helen F. Gaines

drew a distinction between the terms "decrypt"

and "decipher." Alice "deciphers" Bob's message;

Eve attempts to "decrypt" it.

Such usage nowadays is "historical," for according to

Bruce Schneier's 1994 book "Applied Cryptography,"

in the current lexicon, decipher and decrypt appear

to have become synonyms.

Webinar
One Click, Universal Protection: Implementing Centralized Security Policies on Linux Systems

As Linux continues to play an ever increasing role in corporate data centers and institutions, ensuring the integrity and protection of these systems must be a priority. With 60% of the world's websites and an increasing share of organization's mission-critical workloads running on Linux, failing to stop malware and other advanced threats on Linux can increasingly impact an organization's reputation and bottom line.

Learn More

Sponsored by Bit9

Webinar
Linux Backup and Recovery Webinar

Most companies incorporate backup procedures for critical data, which can be restored quickly if a loss occurs. However, fewer companies are prepared for catastrophic system failures, in which they lose all data, the entire operating system, applications, settings, patches and more, reducing their system(s) to “bare metal.” After all, before data can be restored to a system, there must be a system to restore it to.

In this one hour webinar, learn how to enhance your existing backup strategies for better disaster recovery preparedness using Storix System Backup Administrator (SBAdmin), a highly flexible bare-metal recovery solution for UNIX and Linux systems.

Learn More

Sponsored by Storix