0

I have found a module pycrypto which has an AES encryption and decryption function, in commandline everything works fine both encryption and decryption,
but if I want to implement it in my program, it fails =(

def aes(txt):
    global crypt
    message="".join(txt) #format the message which has to be encrypted/decrypted to a string
    c=0
    plist="".join(pflist)
    while len(plist)<15:
        plist+="a"
        c+=1
    #loop is to be sure the password has at least 16 characters.
    plist+=str(c)
    obj=AES.new(plist[:16], AES.MODE_ECB)
    if crypt == "en":
        c=0
        while len(message)/16 != len(message)//16:
            message+="a"
            c+=1
        #loop is to be sure the message is a multiple of 16
        ciphertext=obj.encrypt(message)
    else:
        print message,len(message)
        ciphertext=obj.decrypt(message)
    return ciphertext

The encryption system succeeds, but the decryption system fails
if I decrypt it with \xb4\xe0\xa0LH/\xefO\xc9|y7&"Af
the program says it has a length of 31 (which strictly seen is also true),
but if you do the following in command line it will say that the length is 16

string='\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
len(string)

I don't know what's wrong... I think it has to do something with the type in which the \xb4\xe0\xa0LH/\xefO\xc9|y7&"Af is passed but I'm not sure...

2
Contributors
11
Replies
12
Views
7 Years
Discussion Span
Last Post by jcao219
0

make it a raw string
"\" escapes!

string=r'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
len(string)

Edited by jcao219: whoops

0

Lol you did exactly the reverse of what I want :D
I want to know how to make it length 16 like command prompt says

0

I'm not sure,
maybe do this?

string=b'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
len(string)

I'm not sure about what you mean by

if I decrypt it with \xb4\xe0\xa0LH/\xefO\xc9|y7&"Af

is there more to your code?

Edited by jcao219: n/a

0
string=b'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
str=u'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
len(string) # 16
len(str)     #also 16

Which one is the best to use?
btw in this case I can append the b or u before the quotes but what if it's a variable?

string=input #string = binput or uinpit won't work...
0
string=b'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
str=u'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'
len(string) # 16
len(str)     #also 16

Which one is the best to use?
btw in this case I can append the b or u before the quotes but what if it's a variable?

string=input #string = binput or uinpit won't work...

b'' would be the best, since you are working with hex strings
'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af' is actually:
0x180, 0x224, 0x160, 0x76, 0x72, 0x47, 0x239, 0x79, 0x201, 0x124, 0x121, 0x55, 0x38, 0x34,, 0x65, 0x102

So if someone were to input that,
they would type 180, then 224, then etc,
and you unichr it into one string

0

b'' would be the best, since you are working with hex strings
'\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af' is actually:
0x180, 0x224, 0x160, 0x76, 0x72, 0x47, 0x239, 0x79, 0x201, 0x124, 0x121, 0x55, 0x38, 0x34,, 0x65, 0x102

So if someone were to input that,
they would type 180, then 224, then etc,
and you unichr it into one string

Okay I can follow a bit,
suppose someone encrypts a text with AES and get as output:\xb4\xe0\xa0lh/\xefo\xc9|y7&"af

After a while the person wants to get the original text and wants to decrypt it with AES, he inserts as text \xb4\xe0\xa0lh/\xefo\xc9|y7&"af and uses the same pass as he previously used. How should my program format the input? It has to give as length 16.

0

Nevermind, there's the solution:

string='\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'


code = [ord(char) for char in string]

print("This is your code:"," ".join([str(char) for char in code]))

#User inputs the code later:

usercode = input("What's your code, seperated by spaces: ")
usercode = usercode.split(" ")

decode = [chr(int(char)) for char in usercode]
str2 = "".join(decode)

print(string == str2)

Edited by jcao219: n/a

0

God Dammit, I'm a 2.6 programmer ;p
2.6 doesn't support the for loop on the end in the first code part.
You don't know perhaps how it should be in 2.6?

0

Here's the 2.0 version (I hope):

string='\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'


code = [ord(char) for char in string]

print "This is your code:"," ".join([str(char) for char in code])

#User inputs the code later:

usercode = raw_input("What's your code, seperated by spaces: ")
usercode = usercode.split(" ")

decode = [chr(int(char)) for char in usercode]
str2 = "".join(decode)

print string == str2
## The user inputted string becomes the original
## string at line 1

Edited by jcao219: n/a

0

Here's the 2.0 version (I hope):

string='\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af'


code = [ord(char) for char in string]

print "This is your code:"," ".join([str(char) for char in code])

#User inputs the code later:

usercode = raw_input("What's your code, seperated by spaces: ")
usercode = usercode.split(" ")

decode = [chr(int(char)) for char in usercode]
str2 = "".join(decode)

print string == str2
## The user inputted string becomes the original
## string at line 1

That works perfect :) thanks
there is though one thing I don't get,
Why is in this case the '\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af' interpreted different as in my first code?

0

That works perfect :) thanks
there is though one thing I don't get,
Why is in this case the '\xb4\xe0\xa0LH/\xefO\xc9|y7&"Af' interpreted different as in my first code?

I really have no idea.
I don't have much experience in encoding strings and stuff like that.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.