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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

2回答

687閲覧

PHPの暗号化について

punineko

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2019/05/30 05:24

編集2019/05/30 06:39

実現したいこと

RubyのコードをPHPのコードに置き換えたい。

発生している問題

PHPで、ruby側にある「cipher = OpenSSL::Cipher.new(CIPHER)」のように暗号オブジェクトを
生成したいです。
※PHPでOpenssl一覧を検索したのですが、暗号オブジェクトの生成する方法がみつけられませんでした。

該当のソースコード

Ruby

1 CIPHER = 'aes-256-cbc'.freeze 2 DIGEST = 'sha256'.freeze 3 PASS = 'password'.freeze 4 5 # @param [String] str / Encryption target string 6 # @return [String] / Encrypted string 7 def encrypt(str) 8 salt = OpenSSL::Random.random_bytes(8) 9# ここから 10 cipher = OpenSSL::Cipher.new(CIPHER) 11 cipher.encrypt 12 cipher.key, cipher.iv = key_iv(cipher, salt) 13 14#ここまでをPHPの置き換え方がわからないです。 15 Base64.encode64('Salted__' << salt << cipher.update(str) << cipher.final) 16 end 17 18 # @note Generation of key and iv 19 private def key_iv(cipher, salt) 20 key_iv_pair = OpenSSL::PKCS5.pbkdf2_hmac(PASS, salt, 1000, cipher.key_len + cipher.iv_len, DIGEST) 21 [key_iv_pair.slice(0, cipher.key_len), key_iv_pair.slice(cipher.key_len, cipher.iv_len)] 22 end
const CIPHER = 'aes-256-cbc'; const DIGEST = 'sha256'; const PASS = 'password'; // @param [String] str / Encryption target string // @return [String] / Encrypted string function encrypt($str){ $salt = openssl_random_pseudo_bytes(8); # ここから※ここ暗号化のサイトを参考にしましたがrubyと方式が違うようです。 $key_data = self::password.$salt; $raw_key = md5($key_data, true); $iv_data = $raw_key.self::password.$salt; $iv = md5($iv_data, true); #ここまでをPHPの置き換え方がわからないです。 // 暗号化 $encrypted = openssl_encrypt($str, self::CIPHER, $raw_key, OPENSSL_RAW_DATA, $iv); return ( base64_encode("Salted__".$salt.$encrypted) ); }

同じ動作にしたいのですがRuby、PHPともに専門でない為置き換えるメソッド等が見つけられなかったの
ご教示ください。

よろしくお願いいたします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punineko

2019/05/30 06:39

修正しました。
guest

回答2

0

ベストアンサー

php

1 $salt = openssl_random_pseudo_bytes(16); 2 $salted = ''; 3 $dx = ''; 4 while (strlen($salted) < 48) { 5 $dx = hash('sha256', $dx.$password.$salt, true); 6 $salted .= $dx; 7 } 8 $key = substr($salted, 0, 32); 9 $iv = substr($salted, 32,16); 10 $encrypted_data = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv); 11 return base64_encode($salt . $encrypted_data);

こんな感じでいかがですか。
PHPのOpenSSL関数を利用して暗号化する

投稿2019/06/10 07:24

hide0128

総合スコア245

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punineko

2019/06/13 07:05

ご回答ありがとうございます。 while分のところを下記に変更したところうまくいきました。 $key_iv_pair = openssl_pbkdf2(self::PASS, $salt, 48, 1000, 'sha256');
guest

0

元ソースとの整合性はわかりませんがPHPとして

  • $passwordは宣言されていないので定数PASSに読み替える
  • self::CIPHERはクラスを意識している?定数CIPHERに読み替える

PHP

1const CIPHER = 'aes-256-cbc'; 2const DIGEST = 'sha256'; 3const PASS = 'password'; 4 5function encrypt($str){ 6 $salt = openssl_random_pseudo_bytes(8); 7 8 $key_data = PASS.$salt; 9 $raw_key = md5($key_data, true); 10 11 $iv_data = $raw_key.PASS.$salt; 12 $iv = md5($iv_data, true); 13 14 $encrypted = openssl_encrypt($str, CIPHER, $raw_key, OPENSSL_RAW_DATA, $iv); 15 return ( base64_encode("Salted__".$salt.$encrypted) ); 16} 17print encrypt("test");

投稿2019/05/30 05:36

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

punineko

2019/05/30 06:41

ご回答ありがとうございます。 質問文を変更しましたが、PHPで暗号オブジェクトを生成したいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問