Tôi đang cố gắng mã hóa một chuỗi trong IOS và sau đó gửi nó đến máy chủ TCP. Phiên bản mã của Python và các phiên bản iOS được hiển thị bên dưới. Vui lòng xem kết quả đầu ra của cả hai phiên bản. Họ trông khá giống nhau nhưng độ dài khác nhau và tôi không biết lý do. Ai có thể kiểm tra nó, điều gì có thể là lý do?Mã hóa AES bằng Python có dạng khác nhau iOS
Xin lưu ý rằng PADDING trong kịch bản Python nên được loại bỏ, vì tôi đã cung cấp độ dài văn bản là 16.
PYTHON Code:
#!/usr/bin/env python
from Crypto.Cipher import AES
import base64
import os
# the block size for the cipher object; must be 16, 24, or 32 for AES
BLOCK_SIZE = 16
PADDING = '{'
# one-liner to sufficiently pad the text to be encrypted
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
# one-liners to encrypt/encode and decrypt/decode a string
# encrypt with AES, encode with base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
secret = "123456789"
# create a cipher object using the random secret
cipher = AES.new(secret)
encoded = EncodeAES(cipher, 'password12345678')
print 'Encrypted string:', encoded
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string:', decoded
OUTPUT:
Mã hóa chuỗi: 57AayWF4jKYx7KzGkwudIBZUsn1ULOC0C4c5YF3xeI8 =
Giải mã chuỗi: password12345678
NSString *[email protected]"123456789";
NSString *mystr [email protected]"password12345678";
const char *utfString = [mystr UTF8String];
NSData *aData=[NSData dataWithBytes: utfString length: strlen(utfString)];
aData=[mystr dataUsingEncoding:NSUTF8StringEncoding];
NSData *data;//=[aData AES128EncryptWithKey:forKey];
data=[aData AES128EncryptWithKey:forKey];
NSString *base64 = [data base64EncodedString];
aData=[data AES128DecryptWithKey:forKey];
mystr=[[NSString alloc] initWithData:aData encoding:NSUTF8StringEncoding];
NSLog(@"AES data : %@ \n %@",mystr,base64);
OUTPUT:
AES dữ liệu: password12345678
57AayWF4jKYx7KzGkwudIKNlwA + HErrmiy1Z0szzZds =
Bạn chỉ có thể bỏ qua các đệm nếu bạn sử dụng [chế độ ECB] (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29). Tôi hy vọng bạn không sử dụng chế độ ECB. – sarnold
Tôi chưa đặt chế độ bằng Python, tôi tin rằng nó đang sử dụng giá trị mặc định. – Bora
@ ngoại trừ chế độ ECB cũng yêu cầu đệm, IV không được đặt ở chế độ ECB hoặc được đặt thành tất cả các số không (nếu nền tảng yêu cầu IV), nhưng chắc chắn cần có đệm. Hoặc là cụ thể cho nền tảng Python/iOS? –