質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

Openssl_decryptでJsのcrypto-jsでAES暗号化したテキストを復号できない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 161

youthK

score 70

久しぶりの投稿になります。

この度、crypto-jsで暗号化したテキストを、PHPで復号しようとしています。
しかしfalseがかってきてしまい、取得で来ていません。

crypto-jsでは↓のJsonで取得しています。
{"ct":"TbmXOUQaoxvjy2eDvQyLTw==","iv":"6dbf44da76d651253ccafb880fe4b152","s":"c153176590f0872b"}

また、コードは下記のように作成しました。

$encoded = 'TbmXOUQaoxvjy2eDvQyLTw==';
$key  = 'c153176590f0872b';
$iv = '6dbf44da76d651253ccafb880fe4b152';
openssl_decrypt($encoded, 'AES-128-CBC', $key, 0, $iv);

上記のopenssl_decryptの結果取得したいテキストはpasspassです。

ご教授いただけますと幸いです。
何卒よろしくお願いいたします。

crypto-js

crypto-js

Jsで行っていること

CryptoJS.AES.encrypt(plaintext, secret(), option).toString();
encrypt: function (cipher, message, key, cfg) {
    // Apply config defaults
    cfg = this.cfg.extend(cfg);

    // Encrypt
    var encryptor = cipher.createEncryptor(key, cfg);
    var ciphertext = encryptor.finalize(message);

    // Shortcut
    var cipherCfg = encryptor.cfg;

    // Create and return serializable cipher params
    return CipherParams.create({
        ciphertext: ciphertext,
        key: key,
        iv: cipherCfg.iv,
        algorithm: cipher,
        mode: cipherCfg.mode,
        padding: cipherCfg.padding,
        blockSize: cipher.blockSize,
        formatter: cfg.format
    });
}


↑で暗号化を行っています。

optionの中身

const option = {
        format: {
            stringify(cipherParams) {
                // create json object with ciphertext
                const jsonObj = {
                    ct: cipherParams.ciphertext.toString(CryptoJS.enc.Base64)
                };

                // optionally add iv and salt
                if (cipherParams.iv) {
                    jsonObj.iv = cipherParams.iv.toString();
                }
                if (cipherParams.salt) {
                    jsonObj.s = cipherParams.salt.toString();
                }

                // stringify json object
                return JSON.stringify(jsonObj);
            },
            parse(jsonStr) {
                // parse json string
                const jsonObj = JSON.parse(jsonStr);

                // extract ciphertext from json object, and create cipher params object
                const cipherParams = CryptoJS.lib.CipherParams.create({
                    ciphertext: CryptoJS.enc.Base64.parse(jsonObj.ct)
                });

                // optionally extract iv and salt
                if (jsonObj.iv) {
                    cipherParams.iv = CryptoJS.enc.Hex.parse(jsonObj.iv)
                }
                if (jsonObj.s) {
                    cipherParams.salt = CryptoJS.enc.Hex.parse(jsonObj.s)
                }

                return cipherParams;
            }
        }
    };

block and paddingなどについて

padding : 2
unpadding : 1
blockSize : 4
mode : processBlock : 2
algorithm : keysize : 8
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2020/02/10 19:34

    openssl_get_cipher_methods の実行結果

    キャンセル

  • youthK

    2020/02/11 09:53

    ご質問ありがとうございます。
    以下が出力されました。

    ```
    [0]=>
    string(11) "AES-128-CBC"
    [1]=>
    string(11) "AES-128-CFB"
    [2]=>
    string(12) "AES-128-CFB1"
    [3]=>
    string(12) "AES-128-CFB8"
    [4]=>
    string(11) "AES-128-CTR"
    [5]=>
    string(11) "AES-128-ECB"
    [6]=>
    string(11) "AES-128-OFB"
    [7]=>
    string(11) "AES-128-XTS"
    [8]=>
    string(11) "AES-192-CBC"
    [9]=>
    string(11) "AES-192-CFB"
    [10]=>
    string(12) "AES-192-CFB1"
    [11]=>
    string(12) "AES-192-CFB8"
    [12]=>
    string(11) "AES-192-CTR"
    [13]=>
    string(11) "AES-192-ECB"
    [14]=>
    string(11) "AES-192-OFB"
    [15]=>
    string(11) "AES-256-CBC"
    [16]=>
    string(11) "AES-256-CFB"
    [17]=>
    string(12) "AES-256-CFB1"
    [18]=>
    string(12) "AES-256-CFB8"
    [19]=>
    string(11) "AES-256-CTR"
    [20]=>
    string(11) "AES-256-ECB"
    [21]=>
    string(11) "AES-256-OFB"
    [22]=>
    string(11) "AES-256-XTS"
    [23]=>
    string(6) "BF-CBC"
    [24]=>
    string(6) "BF-CFB"
    [25]=>
    string(6) "BF-ECB"
    [26]=>
    string(6) "BF-OFB"
    [27]=>
    string(16) "CAMELLIA-128-CBC"
    [28]=>
    string(16) "CAMELLIA-128-CFB"
    [29]=>
    string(17) "CAMELLIA-128-CFB1"
    [30]=>
    string(17) "CAMELLIA-128-CFB8"
    [31]=>
    string(16) "CAMELLIA-128-ECB"
    [32]=>
    string(16) "CAMELLIA-128-OFB"
    [33]=>
    string(16) "CAMELLIA-192-CBC"
    [34]=>
    string(16) "CAMELLIA-192-CFB"
    [35]=>
    string(17) "CAMELLIA-192-CFB1"
    [36]=>
    string(17) "CAMELLIA-192-CFB8"
    [37]=>
    string(16) "CAMELLIA-192-ECB"
    [38]=>
    string(16) "CAMELLIA-192-OFB"
    [39]=>
    string(16) "CAMELLIA-256-CBC"
    [40]=>
    string(16) "CAMELLIA-256-CFB"
    [41]=>
    string(17) "CAMELLIA-256-CFB1"
    [42]=>
    string(17) "CAMELLIA-256-CFB8"
    [43]=>
    string(16) "CAMELLIA-256-ECB"
    [44]=>
    string(16) "CAMELLIA-256-OFB"
    [45]=>
    string(9) "CAST5-CBC"
    [46]=>
    string(9) "CAST5-CFB"
    [47]=>
    string(9) "CAST5-ECB"
    [48]=>
    string(9) "CAST5-OFB"
    [49]=>
    string(7) "DES-CBC"
    [50]=>
    string(7) "DES-CFB"
    [51]=>
    string(8) "DES-CFB1"
    [52]=>
    string(8) "DES-CFB8"
    [53]=>
    string(7) "DES-ECB"
    [54]=>
    string(7) "DES-EDE"
    [55]=>
    string(11) "DES-EDE-CBC"
    [56]=>
    string(11) "DES-EDE-CFB"
    [57]=>
    string(11) "DES-EDE-OFB"
    [58]=>
    string(8) "DES-EDE3"
    [59]=>
    string(12) "DES-EDE3-CBC"
    [60]=>
    string(12) "DES-EDE3-CFB"
    [61]=>
    string(13) "DES-EDE3-CFB1"
    [62]=>
    string(13) "DES-EDE3-CFB8"
    [63]=>
    string(12) "DES-EDE3-OFB"
    [64]=>
    string(7) "DES-OFB"
    [65]=>
    string(8) "DESX-CBC"
    [66]=>
    string(8) "IDEA-CBC"
    [67]=>
    string(8) "IDEA-CFB"
    [68]=>
    string(8) "IDEA-ECB"
    [69]=>
    string(8) "IDEA-OFB"
    [70]=>
    string(10) "RC2-40-CBC"
    [71]=>
    string(10) "RC2-64-CBC"
    [72]=>
    string(7) "RC2-CBC"
    [73]=>
    string(7) "RC2-CFB"
    [74]=>
    string(7) "RC2-ECB"
    [75]=>
    string(7) "RC2-OFB"
    [76]=>
    string(3) "RC4"
    [77]=>
    string(6) "RC4-40"
    [78]=>
    string(12) "RC4-HMAC-MD5"
    [79]=>
    string(8) "SEED-CBC"
    [80]=>
    string(8) "SEED-CFB"
    [81]=>
    string(8) "SEED-ECB"
    [82]=>
    string(8) "SEED-OFB"
    [83]=>
    string(11) "aes-128-cbc"
    [84]=>
    string(11) "aes-128-ccm"
    [85]=>
    string(11) "aes-128-cfb"
    [86]=>
    string(12) "aes-128-cfb1"
    [87]=>
    string(12) "aes-128-cfb8"
    [88]=>
    string(11) "aes-128-ctr"
    [89]=>
    string(11) "aes-128-ecb"
    [90]=>
    string(11) "aes-128-gcm"
    [91]=>
    string(11) "aes-128-ofb"
    [92]=>
    string(11) "aes-128-xts"
    [93]=>
    string(11) "aes-192-cbc"
    [94]=>
    string(11) "aes-192-ccm"
    [95]=>
    string(11) "aes-192-cfb"
    [96]=>
    string(12) "aes-192-cfb1"
    [97]=>
    string(12) "aes-192-cfb8"
    [98]=>
    string(11) "aes-192-ctr"
    [99]=>
    string(11) "aes-192-ecb"
    [100]=>
    string(11) "aes-192-gcm"
    [101]=>
    string(11) "aes-192-ofb"
    [102]=>
    string(11) "aes-256-cbc"
    [103]=>
    string(11) "aes-256-ccm"
    [104]=>
    string(11) "aes-256-cfb"
    [105]=>
    string(12) "aes-256-cfb1"
    [106]=>
    string(12) "aes-256-cfb8"
    [107]=>
    string(11) "aes-256-ctr"
    [108]=>
    string(11) "aes-256-ecb"
    [109]=>
    string(11) "aes-256-gcm"
    [110]=>
    string(11) "aes-256-ofb"
    [111]=>
    string(11) "aes-256-xts"
    [112]=>
    string(6) "bf-cbc"
    [113]=>
    string(6) "bf-cfb"
    [114]=>
    string(6) "bf-ecb"
    [115]=>
    string(6) "bf-ofb"
    [116]=>
    string(16) "camellia-128-cbc"
    [117]=>
    string(16) "camellia-128-cfb"
    [118]=>
    string(17) "camellia-128-cfb1"
    [119]=>
    string(17) "camellia-128-cfb8"
    [120]=>
    string(16) "camellia-128-ecb"
    [121]=>
    string(16) "camellia-128-ofb"
    [122]=>
    string(16) "camellia-192-cbc"
    [123]=>
    string(16) "camellia-192-cfb"
    [124]=>
    string(17) "camellia-192-cfb1"
    [125]=>
    string(17) "camellia-192-cfb8"
    [126]=>
    string(16) "camellia-192-ecb"
    [127]=>
    string(16) "camellia-192-ofb"
    [128]=>
    string(16) "camellia-256-cbc"
    [129]=>
    string(16) "camellia-256-cfb"
    [130]=>
    string(17) "camellia-256-cfb1"
    [131]=>
    string(17) "camellia-256-cfb8"
    [132]=>
    string(16) "camellia-256-ecb"
    [133]=>
    string(16) "camellia-256-ofb"
    [134]=>
    string(9) "cast5-cbc"
    [135]=>
    string(9) "cast5-cfb"
    [136]=>
    string(9) "cast5-ecb"
    [137]=>
    string(9) "cast5-ofb"
    [138]=>
    string(7) "des-cbc"
    [139]=>
    string(7) "des-cfb"
    [140]=>
    string(8) "des-cfb1"
    [141]=>
    string(8) "des-cfb8"
    [142]=>
    string(7) "des-ecb"
    [143]=>
    string(7) "des-ede"
    [144]=>
    string(11) "des-ede-cbc"
    [145]=>
    string(11) "des-ede-cfb"
    [146]=>
    string(11) "des-ede-ofb"
    [147]=>
    string(8) "des-ede3"
    [148]=>
    string(12) "des-ede3-cbc"
    [149]=>
    string(12) "des-ede3-cfb"
    [150]=>
    string(13) "des-ede3-cfb1"
    [151]=>
    string(13) "des-ede3-cfb8"
    [152]=>
    string(12) "des-ede3-ofb"
    [153]=>
    string(7) "des-ofb"
    [154]=>
    string(8) "desx-cbc"
    [155]=>
    string(13) "id-aes128-CCM"
    [156]=>
    string(13) "id-aes128-GCM"
    [157]=>
    string(14) "id-aes128-wrap"
    [158]=>
    string(13) "id-aes192-CCM"
    [159]=>
    string(13) "id-aes192-GCM"
    [160]=>
    string(14) "id-aes192-wrap"
    [161]=>
    string(13) "id-aes256-CCM"
    [162]=>
    string(13) "id-aes256-GCM"
    [163]=>
    string(14) "id-aes256-wrap"
    [164]=>
    string(24) "id-smime-alg-CMS3DESwrap"
    [165]=>
    string(8) "idea-cbc"
    [166]=>
    string(8) "idea-cfb"
    [167]=>
    string(8) "idea-ecb"
    [168]=>
    string(8) "idea-ofb"
    [169]=>
    string(10) "rc2-40-cbc"
    [170]=>
    string(10) "rc2-64-cbc"
    [171]=>
    string(7) "rc2-cbc"
    [172]=>
    string(7) "rc2-cfb"
    [173]=>
    string(7) "rc2-ecb"
    [174]=>
    string(7) "rc2-ofb"
    [175]=>
    string(3) "rc4"
    [176]=>
    string(6) "rc4-40"
    [177]=>
    string(12) "rc4-hmac-md5"
    [178]=>
    string(8) "seed-cbc"
    [179]=>
    string(8) "seed-cfb"
    [180]=>
    string(8) "seed-ecb"
    [181]=>
    string(8) "seed-ofb"
    ```

    キャンセル

回答 1

0

エラーが出ているはずです。まずそれを理解するところから始めましょう。
JavaScript 側で何をやったのかも追記すると良いです

その後で、こちらを参照すると良さそうです。
Encrypt with CryptoJS and decrypt with PHP

JavaScript 側の出力が調整できない場合、結構ヤッカイなようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/11 11:01

    "s" を key としていますが、salt のようです。
    これ、ドキュメントとか無いんですか?
    解析しながら作成するようなものではないので、仕様が分かっていないと見る気になりません。

    キャンセル

  • 2020/02/11 12:51

    すでに記載済みですが、
    crypto-jsのマニュアルはございます
    https://code.google.com/archive/p/crypto-js/

    キャンセル

  • 2020/02/11 13:06

    key すらわからないのであれば、復号は無理ですね。
    諦めるしか無いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる