2016-09-06 12:23:48 +00:00
import sys , rsa_key_generator as rkg , os
DEFAULT_BLOCK_SIZE = 128
BYTE_SIZE = 256
2019-10-05 05:14:13 +00:00
2016-09-06 12:23:48 +00:00
def main ( ) :
2019-10-05 05:14:13 +00:00
filename = " encrypted_file.txt "
2020-01-18 12:24:33 +00:00
response = input ( r " Encrypt \ Decrypt [e \ d]: " )
2016-09-06 12:23:48 +00:00
2019-10-05 05:14:13 +00:00
if response . lower ( ) . startswith ( " e " ) :
mode = " encrypt "
elif response . lower ( ) . startswith ( " d " ) :
mode = " decrypt "
2016-09-06 12:23:48 +00:00
2019-10-05 05:14:13 +00:00
if mode == " encrypt " :
if not os . path . exists ( " rsa_pubkey.txt " ) :
rkg . makeKeyFiles ( " rsa " , 1024 )
2019-08-19 13:37:49 +00:00
2019-10-05 05:14:13 +00:00
message = input ( " \n Enter message: " )
pubKeyFilename = " rsa_pubkey.txt "
print ( " Encrypting and writing to %s ... " % ( filename ) )
2016-09-06 12:23:48 +00:00
encryptedText = encryptAndWriteToFile ( filename , pubKeyFilename , message )
2019-10-05 05:14:13 +00:00
print ( " \n Encrypted text: " )
2016-09-06 12:23:48 +00:00
print ( encryptedText )
2019-10-05 05:14:13 +00:00
elif mode == " decrypt " :
privKeyFilename = " rsa_privkey.txt "
print ( " Reading from %s and decrypting... " % ( filename ) )
2016-09-06 12:23:48 +00:00
decryptedText = readFromFileAndDecrypt ( filename , privKeyFilename )
2019-10-05 05:14:13 +00:00
print ( " writing decryption to rsa_decryption.txt... " )
with open ( " rsa_decryption.txt " , " w " ) as dec :
2016-09-06 12:23:48 +00:00
dec . write ( decryptedText )
2019-10-05 05:14:13 +00:00
print ( " \n Decryption: " )
2016-09-06 12:23:48 +00:00
print ( decryptedText )
def getBlocksFromText ( message , blockSize = DEFAULT_BLOCK_SIZE ) :
2019-10-05 05:14:13 +00:00
messageBytes = message . encode ( " ascii " )
2016-09-06 12:23:48 +00:00
blockInts = [ ]
for blockStart in range ( 0 , len ( messageBytes ) , blockSize ) :
blockInt = 0
for i in range ( blockStart , min ( blockStart + blockSize , len ( messageBytes ) ) ) :
blockInt + = messageBytes [ i ] * ( BYTE_SIZE * * ( i % blockSize ) )
blockInts . append ( blockInt )
return blockInts
def getTextFromBlocks ( blockInts , messageLength , blockSize = DEFAULT_BLOCK_SIZE ) :
message = [ ]
for blockInt in blockInts :
blockMessage = [ ]
for i in range ( blockSize - 1 , - 1 , - 1 ) :
if len ( message ) + i < messageLength :
asciiNumber = blockInt / / ( BYTE_SIZE * * i )
blockInt = blockInt % ( BYTE_SIZE * * i )
blockMessage . insert ( 0 , chr ( asciiNumber ) )
message . extend ( blockMessage )
2019-10-05 05:14:13 +00:00
return " " . join ( message )
2016-09-06 12:23:48 +00:00
def encryptMessage ( message , key , blockSize = DEFAULT_BLOCK_SIZE ) :
encryptedBlocks = [ ]
n , e = key
for block in getBlocksFromText ( message , blockSize ) :
encryptedBlocks . append ( pow ( block , e , n ) )
return encryptedBlocks
def decryptMessage ( encryptedBlocks , messageLength , key , blockSize = DEFAULT_BLOCK_SIZE ) :
decryptedBlocks = [ ]
n , d = key
for block in encryptedBlocks :
decryptedBlocks . append ( pow ( block , d , n ) )
return getTextFromBlocks ( decryptedBlocks , messageLength , blockSize )
def readKeyFile ( keyFilename ) :
2019-01-08 08:59:23 +00:00
with open ( keyFilename ) as fo :
content = fo . read ( )
2019-10-05 05:14:13 +00:00
keySize , n , EorD = content . split ( " , " )
2016-09-06 12:23:48 +00:00
return ( int ( keySize ) , int ( n ) , int ( EorD ) )
2019-10-05 05:14:13 +00:00
def encryptAndWriteToFile (
messageFilename , keyFilename , message , blockSize = DEFAULT_BLOCK_SIZE
) :
2016-09-06 12:23:48 +00:00
keySize , n , e = readKeyFile ( keyFilename )
if keySize < blockSize * 8 :
2019-10-05 05:14:13 +00:00
sys . exit (
" ERROR: Block size is %s bits and key size is %s bits. The RSA cipher requires the block size to be equal to or greater than the key size. Either decrease the block size or use different keys. "
% ( blockSize * 8 , keySize )
)
2016-09-06 12:23:48 +00:00
encryptedBlocks = encryptMessage ( message , ( n , e ) , blockSize )
for i in range ( len ( encryptedBlocks ) ) :
encryptedBlocks [ i ] = str ( encryptedBlocks [ i ] )
2019-10-05 05:14:13 +00:00
encryptedContent = " , " . join ( encryptedBlocks )
2020-01-03 14:25:36 +00:00
encryptedContent = " {} _ {} _ {} " . format ( len ( message ) , blockSize , encryptedContent )
2019-10-05 05:14:13 +00:00
with open ( messageFilename , " w " ) as fo :
2019-01-08 08:59:23 +00:00
fo . write ( encryptedContent )
2016-09-06 12:23:48 +00:00
return encryptedContent
def readFromFileAndDecrypt ( messageFilename , keyFilename ) :
keySize , n , d = readKeyFile ( keyFilename )
2019-01-08 08:59:23 +00:00
with open ( messageFilename ) as fo :
content = fo . read ( )
2019-10-05 05:14:13 +00:00
messageLength , blockSize , encryptedMessage = content . split ( " _ " )
2016-09-06 12:23:48 +00:00
messageLength = int ( messageLength )
blockSize = int ( blockSize )
if keySize < blockSize * 8 :
2019-10-05 05:14:13 +00:00
sys . exit (
" ERROR: Block size is %s bits and key size is %s bits. The RSA cipher requires the block size to be equal to or greater than the key size. Did you specify the correct key file and encrypted file? "
% ( blockSize * 8 , keySize )
)
2016-09-06 12:23:48 +00:00
encryptedBlocks = [ ]
2019-10-05 05:14:13 +00:00
for block in encryptedMessage . split ( " , " ) :
2016-09-06 12:23:48 +00:00
encryptedBlocks . append ( int ( block ) )
return decryptMessage ( encryptedBlocks , messageLength , ( n , d ) , blockSize )
2019-10-05 05:14:13 +00:00
if __name__ == " __main__ " :
2016-09-06 12:23:48 +00:00
main ( )