データの暗号化および復号する方法

#目次
1. はじめに
2. 実装方法
3. まとめ

#はじめに
暗号化と復号化について説明します。

**暗号化**
データを第三者が解読できないように一定のルールのもとに変換することです。

**復号**
暗号化されたデータを元に戻すことです。

暗号化するケースとしては**パスワード**があげられます。
暗号化によって、権限の無い照会や使用からデータを保護します。
そこで今回はデータの暗号化および復号についてご紹介したいと思います。

#実装方法
**①画面の作成**
このような画面を作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/244a35a9-89f3-f83e-cad8-45f589cc35b9.png)

上のテキストに入力し、右にある「暗号化および復号」ボタンを押すと
`Output Encrypt`に暗号化されたデータが
`Output Decrypt`に復号されたデータが表示されます。

**②モジュールの作成**
暗号化と復号をするためのモジュールを作成します。

* encryptData.jp:暗号化および復号を行います。
1) 左上のタブが`Project`になっていることを確認し、`Modules`の右側にあるボタンをクリックしてください。
2) `New JS modules`をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/37f8837c-2192-a107-771a-b2cd52870da3.png)

3) 作成されたmoduleをリネームしてください。
（今回は `encryptData` とつけています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d31f905f-4031-b464-47a8-1df6d0dff49f.png)

**③`encryptData.js`の設定**
では、encryptData.jsに設定していきます。

```encryptData.js
const encryptData= function(){
  // 暗号化
  const encryptData = function (data, key) {
    try {
      // 暗号化キーの生成
      var encryptDecryptKey = kony.crypto.newKey("passphrase", 128, {
        passphrasetext: [key],
        subalgo: "aes",
        passphrasehashalgo: "md5"
      });
      var properties = {
        padding: "pkcs5",
        mode: "cbc",
        initializationvector: "1234567890123456"
      };
      var encryptedData = kony.crypto.encrypt("aes", encryptDecryptKey, data, properties);
      return (encryptedData);
    } catch (exception) {
      kony.print(JSON.stringify(exception));
    }
  };
  // 復号
  const decryptData = function (data, key) {
    try {
      // 復号化キーの生成
      var encryptDecryptKey = kony.crypto.newKey("passphrase", 128, {
        passphrasetext: [key],
        subalgo: "aes",
        passphrasehashalgo: "md5"
      });
      var properties = {
        padding: "pkcs5",
        mode: "cbc",
        initializationvector: "1234567890123456"
      };
      var decryptedData = kony.crypto.decrypt("aes", encryptDecryptKey, data, properties);
      var clas = Object.prototype.toString.call(decryptedData).slice(8, -1);
      if(clas === "Object"){
        decryptedData = "";
      }
      return decryptedData;
    } catch (exception) {
      kony.print(JSON.stringify(exception));
    }
  };
  
    return {
    encryptData : encryptData,
    decryptData : decryptData,
  };
}();
```

上を説明します。
**kony.crypto.newKey**:このAPIを使用すると、指定したアルゴリズムを使用して暗号化用のキーを作成できます。このAPIを使用して作成されたキーは、平文（暗号化されていないデータ）の暗号化と暗号化されたデータの復号化に使用されます。
入力パラメータ（algo、keystrength、propertiesTable）について簡単に記載します。

**algo**：キーを作成するためのスキーム

|パラメータ  |説明  |
|---|---|
|securerandom  |キーを生成するスキームとして安全な乱数を使用。このスキームは常に一意のキーを生成。  | 
|random  |キーを生成するためのスキームとして乱数を使用。このスキームは常に一意のキーを生成。  |
| passphrase | 同じパスフレーズの場合、常に同じキーを生成。 |  

※ randomおよびsecurerandomはiPhoneでのみサポートされています。
※ Androidでは、securerandomとrandomの違いはありません。
※ SPAではパスフレーズのみがサポートされています。

**keystrength**：キーの強さを示すビット数

|名称  |説明  |
|---|---|
|aes  |可能な値は128、192、256  | 
|tripledes  |可能な値は192|


**propertiesTable**：プロパティ値

|プロパティ値  |説明  |
|---|---|
|passphrasetext   |[文字列の配列]：パスフレーズ。| 
|subalgo  |キーの作成に使用されるキーアルゴリズム。入力可能な値はaesとtripledes|
|passphrasehashlogo | パスフレーズテキストに適用されるハッシュアルゴリズム。入力可能な値はmd2（キー強度128の場合）、md4（キー強度128の場合）、md5（キー強度128の場合）、sha2（キー強度256の場合） |

---

**kony.crypto.encrypt**:指定されたキーとアルゴリズムを使用して入力テキストを暗号化します。
入力パラメータ（algo、generatekey、inputstring、propertiesTable）について簡単に記載します。

**algo**：入力文字列を暗号化する必要があるアルゴリズムを指定
入力可能な値はaes,tripledes,rsaとなります。
※ tripledesはWindowsプラットフォームではサポートされていません。

**generatekey**:暗号化に使用されるキー

**tripledes**：暗号化する必要のあるデータ

**propertiesTable**：プロパティ値

|プロパティ値  |説明  |
|---|---|
|padding  |適用する必要のあるパディングを示す文字列| 
|mode  |暗号化モードを表す文字列|
|initializationvector| 使用される初期化ベクトルを示す文字列|

---

**kony.crypto.decrypt**:指定されたキーとアルゴリズムを使用して入力テキストを復号します。
入力パラメータ（algo、generatekey、encryptedRawbytes、propertiesTable）について簡単に記載します。

**algo**：復号化するアルゴリズムを指定
入力可能な値はaes,tripledes,rsaとなります。
※ tripledesはWindowsプラットフォームではサポートされていません。

**generatekey**:復号化に使用されるキーを保持

**encryptedRawbytes**：復号化される暗号化されたテキストのrawバイトを含むオブジェクト

**propertiesTable**：プロパティ値

|プロパティ値  |説明  |
|---|---|
|padding  |適用する必要のあるパディングを示す文字列| 
|mode  |暗号化モードを表す文字列|
|initializationvector| 復号化の実行に使用される初期化ベクトルを示す文字列|

**④`frmDemoController.js`の設定とアクションの紐付け**
では、frmDemoController.jsを設定していきます。

```frmDemoController.js
define({ 

  CONST_KEY_ENCRYPT: 'key_encrypt',
  onClickEncrypt: function () {
    var data = this.view.txtData.text;
    if (data) {
      this.view.lblOutputEncrypt.text = encryptData.encryptData(data, this.CONST_KEY_ENCRYPT);
      this.view.lblOutputDecrypt.text = encryptData.decryptData(this.view.lblOutputEncrypt.text, this.CONST_KEY_ENCRYPT);
    }
  }
 });
```

`暗号化および復号`ボタンをクリックし、`Action`にある`onClick`をクリックしてください。
Invoke Functionを選択し、`onClickEncrypt`を設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/356e62cd-aa19-1f93-f98b-c42f32f09d30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/069e4cf3-712b-508a-11e2-b6c6c28006aa.png)

ここまでで、データの暗号化および復号の準備が完了しました。
次に実際にどうなるかみていきましょう！

**⑤実装の確認**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/VlHUyFluWZ">pic.twitter.com/VlHUyFluWZ</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1346267927381610496?ref_src=twsrc%5Etfw">January 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

暗号化および復号されていることが分かりますね！

#まとめ
今回は、データの暗号化および復号する方法を説明しました。
暗号化しないといけないような機密データを扱う際に参考にしていただけたらと思います。
暗号化と復号もKonyでしたら可能です！
ぜひ試してみてください:wave:

#参考
暗号化と復号について：
https://www.kumikomi.jp/encrypt/

kony.theme Namespaceの説明: 
https://docs.kony.com/konylibrary/visualizer/viz_widget_prog_guide/Content/Button_Events.htm#onClick

kony.cryptoの説明：
https://docs.kony.com/konylibrary/visualizer/viz_api_dev_guide/content/kony.crypto_functions.htm#encrypt