Flutter是當下最流行的新興APP跨平臺開發架構。學習需趁早。git
由於個人項目須要使用AES加解密,而flutter package中並無支持Dart 2的AES加密庫,因此寫了Cipher2插件並拿出來開源給你們用。本文介紹如何使用Cipher2插件在Flutter app中實現AES加密解密。本文不講述如何安裝配置Flutter開發環境。若有須要我會寫關於安裝配置flutter開環環境的文章。github
Cipher2插件地址:算法
各位若是有其餘加密算法需求,請在github發issue,我會盡快跟進。PR is welcome!架構
打開cmd命令行,cd命令定位到你想要建立項目的目錄。而後建立flutter app項目app
flutter create cipher2_test
用vscode打開項目目錄async
打開上圖中pubspec.yaml文件的dependencies中,添加以下內容。而後ctrl + s保存,vscode會自動爲你安裝好插件。學習
dependencies: flutter: sdk: flutter cipher2: any
Cipher2插件目前支持AES加密的cbc(128位 padding7)模式和gcm模式(128位)。插件提供了5個方法來實現加密解密。本插件全部字符串均使用UTF8編碼。在處理第三方密文的時候,請注意字符串編碼,以避免沒必要要的麻煩。測試
/* Cipher2.encryptAesCbc128Padding7 參數: plainText: 被加密字符串 key:128 bit字符串 iv: 128 bit字符串 返回: 通過base64編碼的密文字符串 */ String encryptedString = await Cipher2.encryptAesCbc128Padding7(plainText, key, iv);
/* Cipher2.decryptAesCbc128Padding7 參數: encryptedString: base64編碼的密文字符串 key:128 bit字符串 iv: 128 bit字符串 返回: 明文字符串 */ String decryptedString = await Cipher2.decryptAesCbc128Padding7(encryptedString, key, iv);
String nonce = Cipher2.generateNonce()
/* Cipher2.encryptAesGcm128 參數: plainText: 被加密字符串 key:128 bit字符串 nonce: based4編碼的92bit nonce,能夠用Cipher2.generateNonce()生成 返回: 通過base64編碼的密文字符串 */ String encryptedString = await Cipher2.encryptAesGcm128(plaintext, key, nonce);
/* Cipher2.decryptAesGcm128 參數: encryptedString: base64編碼的密文字符串 key:128 bit字符串 nonce: based4編碼的92bit nonce,能夠用Cipher2.generateNonce()生成 返回: 明文字符串 */ result = await Cipher2.decryptAesGcm128(encryptedString, key, nonce);
官方提供了很是簡單明瞭的測試用例,方便加密解密和異常捕獲編碼
https://github.com/shyandsy/c...加密
// Platform messages are asynchronous, so we initialize in an async method. Future<void> initPlatformState() async { String encryptedString; String plainText = '我是shyandsy,never give up man'; String key = 'xxxxxxxxxxxxxxxx'; String iv = 'yyyyyyyyyyyyyyyy'; String decryptedString; // 測試AES 128bit cbc padding 7加密 await testEncryptAesCbc128Padding7(); // 測試AES 128bit cbc padding 7解密 await testDecryptAesCbc128Padding7(); // 測試AES 128bit gcm加解密 await testEncryptAesGcm128(); // GenerateNonce(); // 加密,而後解密 try { // 加密 encryptedString = await Cipher2.encryptAesCbc128Padding7(plainText, key, iv); // 解密 decryptedString = await Cipher2.decryptAesCbc128Padding7(encryptedString, key, iv); } on PlatformException catch(e) { encryptedString = ""; decryptedString = ""; print("exception code: " + e.code); print("exception message: " + e.message); } // If the widget was removed from the tree while the asynchronous platform // message was in flight, we want to discard the reply rather than calling // setState to update our non-existent appearance. if (!mounted) return; setState(() { _plainText = plainText; _encryptedString = encryptedString; _decryptedString = decryptedString; }); }
讀一遍test case就會用了。這裏再也不重複