mark_667
asked on
Dictionary help needed
I'm trying to implement a forward search attack (i.e. a brute force generating and testing all possible combinations) on 2 words encrypted in RSA whose contents may include A-Z and [space] (which might be used for padding), that is 65-90 and 32 ASCII. I have some (very limited) knowledge of Python but can't get the dictionary contents right. I've included the code below, can someone please give me some pointers.
scrambled1 = "3648141"
scrambled2 = "5608387"
dictionary1 = {}
code=0
e=5
n=21508387
for a in range(65,91):
for b in range(65,91):
for c in range(65,91):
plain=(a<<16)+(b<<8)+c
code = pow(plain,e,n)
dictionary1[code]=plain
for d in range(65,91):
for e in range(65,91):
plain=(f<<16)+(g<<8)+32
code = pow(plain,e,n)
dictionary1[code]=plain
dictionary1[code]=scramble d2
dictionary1[code]=scramble d2
scrambled1 = "3648141"
scrambled2 = "5608387"
dictionary1 = {}
code=0
e=5
n=21508387
for a in range(65,91):
for b in range(65,91):
for c in range(65,91):
plain=(a<<16)+(b<<8)+c
code = pow(plain,e,n)
dictionary1[code]=plain
for d in range(65,91):
for e in range(65,91):
plain=(f<<16)+(g<<8)+32
code = pow(plain,e,n)
dictionary1[code]=plain
dictionary1[code]=scramble
dictionary1[code]=scramble
I don't know enough about RSA encryption to even begin to guess what you mean by "can't get the dictionary contents right". Perhaps if you explain what the contents should be and what you are getting we could help.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
The dictionary holds all plaintext possibilities for the specified range in one column and stores the encrypted versions of these in the other giving a lookup table.
This should allow me to match the scrambled words to one of the encrypted entries and look at the corresponding plaintext entry to get a result. As you can see if you run it, this does not work. I tried the code mish33 posted above but when I printed the contents of code to a file to check what was being produced the first scrambled word was present but not the second.
This could only happen if I had not covered all possibilities when generating values for code. Also, I had no way of looking up the corresponding plaintext when a match was found. Here's a modified version I've tried:
scrambled1 = "3648141"
scrambled2 = "5608387"
e=5
n=21508387
AZ = range(65,91)
AZspace = list(AZ)+[32]
outfd=open('outfile.txt',' wb')
for a in AZspace:
for b in AZspace:
for c in AZspace:
plain=(a<<16)+(b<<8)+c
code = pow(plain,e,n)
outfd.write('%s \n' % str(plain))
outfd.write('%s \n' % str(code))
outfd.write('%s \n')
if code==scrambled1:
print 'found 1', ''.join(chr(x) for x in (a, b, c))
if code==scrambled2:
print 'found 2', ''.join(chr(x) for x in (a, b, c))
outfd.close()
I think the problem is the space. Instead of encrypting it with the characters in the range A-Z it seems to just be adding it on to the end of what is encrypted, thus not generating all of the necessary possibilities. Any further thoughts?
This should allow me to match the scrambled words to one of the encrypted entries and look at the corresponding plaintext entry to get a result. As you can see if you run it, this does not work. I tried the code mish33 posted above but when I printed the contents of code to a file to check what was being produced the first scrambled word was present but not the second.
This could only happen if I had not covered all possibilities when generating values for code. Also, I had no way of looking up the corresponding plaintext when a match was found. Here's a modified version I've tried:
scrambled1 = "3648141"
scrambled2 = "5608387"
e=5
n=21508387
AZ = range(65,91)
AZspace = list(AZ)+[32]
outfd=open('outfile.txt','
for a in AZspace:
for b in AZspace:
for c in AZspace:
plain=(a<<16)+(b<<8)+c
code = pow(plain,e,n)
outfd.write('%s \n' % str(plain))
outfd.write('%s \n' % str(code))
outfd.write('%s \n')
if code==scrambled1:
print 'found 1', ''.join(chr(x) for x in (a, b, c))
if code==scrambled2:
print 'found 2', ''.join(chr(x) for x in (a, b, c))
outfd.close()
I think the problem is the space. Instead of encrypting it with the characters in the range A-Z it seems to just be adding it on to the end of what is encrypted, thus not generating all of the necessary possibilities. Any further thoughts?
Check that scrambled2 really is 5608387, because that number is encoded by combination
a,b,c = 209, 106, 126 (string 'Ñj~') which far outside AZspace.
a,b,c = 209, 106, 126 (string 'Ñj~') which far outside AZspace.