Javaの-Pythonの最新バージョンとの相互AES暗号化と復号化を達成

前件

PythonとPythonの暗号文の暗号化されたバージョンは、Javaコード、およびその逆で復号することができるように、1つの使用と同じJava AES暗号化アルゴリズムを必要とします。

Python実装

Pythonの3.6バージョン

# - * -コーディング:UTF-8 - * - 
輸入base64で
Crypto.Cipher輸入AESから
の構文解析urllibはインポートから

AES_SECRET_KEY = 'lingyejunAesTest' #此处16 | 24 | 32个字符
IV = "1234567890123456" 
パディング算法
BS = LEN (AES_SECRET_KEY)
パッド=ラムダS:S +(BS - LEN(S)%のBS)* CHR(BS - LEN(S)%のBS)
unpad =ラムダS:S [0:-ord(S [-1:] )] 


クラスAES_ENCRYPT(オブジェクト):
    デフ__init __(自己):
        self.key = AES_SECRET_KEY 
        self.mode = AES.MODE_CBC 

    #加密函数
    デフ暗号化(自己、テキスト):
        cryptor = AES.new(self.key.encode(」 UTF8 ")、self.mode、IV.encode(" UTF8 "))
        self.ciphertext = cryptor.encrypt(バイト(パッド(テキスト)、エンコーディング="UTF8" )) 」UTF8「)) 
        base64エンコーディングを使用する場合#AES ASCII文字セット、端末に出力または保存されたが、問題となることができるとき、文字列の暗号化は必ずしも得られません
        リターンbase64.b64encode(self.ciphertext) 
解密函数
    デフ(自己、テキスト)解読:
        デコード= base64.b64decode(テキスト)
        cryptor = AES.new(self.key.encode( "UTF8")、self.mode、IV .encode( "UTF8"))
        plain_text = cryptor.decrypt(デコード)
        リターンunpad(plain_text)

場合__name__ == '__main__':
    AES_ENCRYPT = AES_ENCRYPT()
    my_email = "[email protected]" 
    E = aes_encrypt.encrypt(my_email )
    D = aes_encrypt.decrypt(E)
    プリント(my_email)
    プリント(E)
    プリント(D)

 

Java実装

sun.misc.BASE64Decoderインポート、
インポートsun.misc.BASE64Encoder; 

輸入javax.crypto.Cipher; 
インポートjavax.crypto.spec.IvParameterSpec; 
インポートするjavax.crypto.spec.SecretKeySpec; 

publicクラスAesTest { 

    / ** 
     *で暗号化キー26は、文字と数字かもしれ
     本明細書で使用されるAES-128-CBC暗号化モード、キー16が必要とされ、*。
     * / 
    プライベートのsKey静的な文字列= "lingyejunAesTest"; 
    プライベートivParameter静的な文字列= "1234567890123456"; 

    //暗号化
    パブリック静的な文字列を暗号化(文字列SSRC)は例外{スロー
        暗号暗号= Cipher.getInstance( "AES / CBC / PKCS5Paddingを"); 
        バイト[] =生のsKey.getBytes() 。 
        SecretKeySpec skeySpec =新しい新しいSecretKeySpec(RAW、 "
        IvParameterSpec IV =新しいIvParameterSpec(ivParameter.getBytesを( )); // CBCモードIVベクトルを必要とし、暗号化アルゴリズムの強度増加
        cipher.init(Cipher.ENCRYPT_MODE、skeySpec、IV)を、
        バイト[] = ENCRYPTED暗号。 doFinal(sSrc.getBytes( "UTF-8")); 
        新しい新しいBase64Encoderを(戻り)(暗号化)をコード;.本明細書で使用される場合、//はBASE64トランスコーディングを行います。
    } 

    //復号
    パブリック静的な文字列復号化(文字列SSRC){ 
        試み{ 
            バイト[] = sKey.getBytes RAW( "ASCII"); 
            SecretKeySpec skeySpec =新しい新しいSecretKeySpec(RAW、 "AES"); 
            暗号暗号= Cipher.getInstance( " AES / CBC / PKCS5Padding「変換); 
            IvParameterSpec IV =新新IvParameterSpec(ivParameter.getBytes());
            cipher.init(Cipher.DECRYPT_MODE、skeySpec、IV)。
            バイト[] encrypted1 =新しいBASE64Decoder()decodeBuffer(SSRC); //先用BASE64解密
            バイト[] =オリジナルcipher.doFinal(encrypted1)。
            ストリングoriginalString =新しい文字列(オリジナル、 "UTF-8"); 
            originalStringを返します。
        }キャッチ(例外例){ 
            戻りヌル。
        } 
    } 

    パブリック静的無効メイン(文字列[] args){ 
        文字列のメール= "[email protected]"。
        試す{ 
            文字列秒=暗号化(電子メール)
            System.out.println(秒)。
            System.out.println(復号化( "CcOtM9WXv0N + OWH / xxedZJnuNUaTU7y3aUBESQLUvVM ="));
        }キャッチ(例外e){ 
            e.printStackTrace(); 
        } 
    } 
}

次に、Javaコードの暗号化キーのうち、Pythonで入れ解読するために

JavaとPythonでAES方式の変換を達成するために行います。

おすすめ

転載: www.cnblogs.com/lingyejun/p/10971308.html