背景:
因项目需要,需要将一个python2编写的aes加密方式改为java实现。
1.源python2实现
Crypto.Cipher binascii <span style="color: #0000ff;">class<span style="color: #000000;"> aesCrypt():
<span style="color: #0000ff;">def <span style="color: #800080;">init<span style="color: #000000;">(self,undealKey):
key =<span style="color: #000000;"> turnMd5(undealKey)
<span style="color: #0000ff;">print<span style="color: #000000;"> undealKey
dealKey =<span style="color: #000000;"> dealKeyAndIV(key.lower())
self.key </span>=<span style="color: #000000;"> dealKey
</span><span style="color: #008000;">#</span><span style="color: #008000;"> self.iv = iv</span>
self.mode =<span style="color: #000000;"> AES.MODE_ECB
self.BS </span>=<span style="color: #000000;"> AES.block_size
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 补位</span>
self.pad = <span style="color: #0000ff;">lambda</span> s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) %<span style="color: #000000;"> self.BS)
self.unpad </span>= <span style="color: #0000ff;">lambda</span> s: s[0:-ord(s[-1<span style="color: #000000;">])]
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> encrypt(self,text):
text </span>=<span style="color: #000000;"> self.pad(text)
cryptor </span>=<span style="color: #000000;"> AES.new(self.key,self.mode)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 目前AES-128 足够目前使用</span>
ciphertext =<span style="color: #000000;"> cryptor.encrypt(text)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 把加密后的字符串转化为16进制字符串</span>
<span style="color: #0000ff;">return</span><span style="color: #000000;"> b2a_hex(ciphertext)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 解密后,去掉补足的空格用strip() 去掉</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> decrypt(self,text):
cryptor </span>=<span style="color: #000000;"> AES.new(self.key,self.mode)
plain_text </span>=<span style="color: #000000;"> cryptor.decrypt(a2b_hex(text))
</span><span style="color: #0000ff;">return</span> self.unpad(plain_text.rstrip(<span style="color: #800000;">'</span><span style="color: #800000;">\0</span><span style="color: #800000;">'</span><span style="color: #000000;">))
<span style="color: #0000ff;">def<span style="color: #000000;"> turnHex(character):
<span style="color: #000000;"><略>
<span style="color: #0000ff;">def<span style="color: #000000;"> debugPrint(str):
<span style="color: #0000ff;">print<span style="color: #000000;"> str
<span style="color: #0000ff;">def<span style="color: #000000;"> dealKeyAndIV(undealKey):<略>
2.经历
1. 我只有python3的环境,因使用到
Crypto这个package的很难安装上去,经过多种尝试,使用替代,故需要修改部分代码
2. 改成python3的文件
Crypto.Cipher binascii == self.key </span>=<span style="color: #000000;"> dealKey
</span><span style="color: #008000;">#</span><span style="color: #008000;"> self.iv = iv</span>
self.mode =<span style="color: #000000;"> AES.MODE_ECB
self.BS </span>=<span style="color: #000000;"> AES.block_size
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 补位</span>
self.pad = <span style="color: #0000ff;">lambda</span> s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) %<span style="color: #000000;"> self.BS)
self.unpad </span>= <span style="color: #0000ff;">lambda</span> s: s[0:-ord(s[-1<span style="color: #000000;">])]
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> encrypt(self,text):
text </span>=<span style="color: #000000;"> self.pad(text)
</span><span style="color: #008000;">#</span><span style="color: #008000;">finalkey=bytes([239,159,125,206,247,119,225,116,254,91,100,130,255,144,207,70])</span>
cryptor =<span style="color: #000000;"> AES.new(bytes(self.key),self.mode)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 目前AES-128 足够目前使用</span>
<span style="color: #008000;">#</span><span style="color: #008000;">ss=bytes([67,122,99,115,81,111,68,112,67,47,75,48,108,98,90,88,87,52,65,43,105,83,72,109,55,110,54,102,85,89,84,56,117,120,79,78,70,69,104,97,57,49,113,66,77,107,74,71,106,103,86,82,51,53,118,73,76,114,61,4,4])</span>
<span style="color: #008000;">#</span><span style="color: #008000;">ss=text.encode()</span>
<span style="color: #008000;">#</span><span style="color: #008000;">print(a2b_hex(ss))</span>
<span style="color: #008000;">#</span><span style="color: #008000;">print(a2b_hex(ss))</span>
ciphertext = cryptor.encrypt(text.encode(<span style="color: #800000;">"</span><span style="color: #800000;">utf-8</span><span style="color: #800000;">"</span><span style="color: #000000;">))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 把加密后的字符串转化为16进制字符串</span>
<span style="color: #0000ff;">return</span><span style="color: #000000;"> b2a_hex(ciphertext)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 解密后,去掉补足的空格用strip() 去掉</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> decrypt(self,self.mode)
plain_text </span>=<span style="color: #000000;"> cryptor.decrypt(a2b_hex(text))
</span><span style="color: #0000ff;">return</span> self.unpad(plain_text.rstrip(<span style="color: #800000;">'</span><span style="color: #800000;">\0</span><span style="color: #800000;">'</span><span style="color: #000000;">))
<span style="color: #0000ff;">def<span style="color: #000000;"> turnHex(character):
value =<span style="color: #000000;"> ord(character)
<span style="color: #008000;">#<span style="color: #008000;"> print value
temp = value - 48
<span style="color: #0000ff;">if value - 48 > 9<span style="color: #000000;">:
<span style="color: #0000ff;">if (value - 97 <= 5) & (value - 97 >=<span style="color: #000000;"> 0):
temp = value - 87
<span style="color: #0000ff;">return<span style="color: #000000;"> temp<span style="color: #0000ff;">def<span style="color: #000000;"> dealKeyAndIV(undealKey):
flag =<span style="color: #000000;"> 0
<span style="color: #ff0000;"> result<span style="color: #ff0000;">=[]
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint 'len=',len(undealKey)/2
<span style="color: #0000ff;">while flag < len(undealKey)/2<span style="color: #000000;">:
characterH = undealKey[flag2<span style="color: #000000;">]
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint characterH
highBit = turnHex(characterH) 16
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint highBit
characterL = undealKey[flag*2+1<span style="color: #000000;">]
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint characterL
lowBit =<span style="color: #000000;"> turnHex(characterL)
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint lowBit
ascValue = highBit+<span style="color: #000000;">lowBit
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint ascValue
<span style="color: #ff0000;"> result.append(ascValue)
<span style="color: #008000;">#<span style="color: #008000;"> debugPrint result
flag += 1
<span style="color: #008000;">#<span style="color: #008000;"> print '-------'
<span style="color: #0000ff;">return<span style="color: #000000;"> result<span style="color: #0000ff;">def<span style="color: #000000;"> turnMd5(str):
m2 =<span style="color: #000000;"> hashlib.md5()
<span style="color: #ff0000;">data <span style="color: #ff0000;">= str.encode(encoding="utf-8"<span style="color: #000000;"><span style="color: #ff0000;">)
m2.update(data)
<span style="color: #0000ff;">return m2.hexdigest()