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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

PHP

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

Q&A

解決済

1回答

4575閲覧

PHPのopenssl_encrypt関数の bf-ecbモードで暗号化しているものと同じ暗号化をgolangで行いたいです。

settanaoto

総合スコア8

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

PHP

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

0グッド

2クリップ

投稿2019/04/19 07:14

前提・実現したいこと

PHPのopenssl_encrypt関数の bf-ecbモードで暗号化しているものと同じ暗号化をgolangで行いたいです。
##php

public function Encode($value) { $crypt = openssl_encrypt($value, "bf-ecb","sample key" , 1); $data = unpack('H*hex', $crypt); $encoded = $data['hex']; return $encoded; }

↑で暗号化しているものと同じことをgolangで行いたいです

public function Decode($value) { $data = pack('H*', $value); $decode = openssl_decrypt($data, "bf-ecb", "sample key", 1); return $decode; }

↑のDecode関数でgolangで作った暗号を復号することが目的です。

試したこと

golang

import ( "encoding/hex" "golang.org/x/crypto/blowfish" ) func main{ println(EncryptString("aiueo", "sample key")) } func EncryptString(target, keyStr string) (string) { plaintext := []byte(target) paddedplaintext := BlowfishChecksizeAndPad(plaintext) encryptedtext, _ := BlowfishEncrypt(paddedplaintext, []byte(keyStr)) return hex.EncodeToString(encryptedtext) } func BlowfishEncrypt(ppt, key []byte) ([]byte) { ecipher, _ := blowfish.NewCipher(key) encrypted := make([]byte, len(ppt)) ecipher.Encrypt(encrypted, ppt) return encrypted } func BlowfishChecksizeAndPad(pt []byte) []byte { modulus := len(pt) % blowfish.BlockSize if modulus != 0 { padlen := blowfish.BlockSize - modulus for i := 0; i < padlen; i++ { pt = append(pt, 0) } } return pt }

aiueoを暗号化した結果

golangの暗号化の結果
edfb75440234af5e

phpでの暗号化の結果
b31ed925f529fa14

になっており、違う結果が帰って来てしまいます。

golangで暗号化した結果のedfb75440234af5eをphpのDecodeで複合しようとしても結果が表示されません。

補足情報(FW/ツールのバージョンなど)

golang 1.11
php 7.3.4

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/04/19 08:23

php しか分かりませんが、ざっと見た感じ余計な処理をしているように見えます。参考にしたサイトがあれば追記されたほうが回答がつくかと。
guest

回答1

0

ベストアンサー

PHP側の独自拡張とgo側がECBモードをサポートしてない事が合わせ技になってますね。

まず、PHP側の独自拡張としてキー長が足りないときは0埋めします。
(普通の実装だと繰り返しで埋めます)

そして、提示されたgoソースは対象文字列をパディングする際に0埋めする実装になっていますが、
PKCSの規格ですとパディングする長さで埋めます。

よって

go

1func BlowfishChecksizeAndPad2(pt []byte) []byte { 2 modulus := len(pt) % blowfish.BlockSize 3 if modulus == 0 { 4 modulus = blowfish.BlockSize 5 } 6 if modulus != 0 { 7 padlen := blowfish.BlockSize - modulus 8 for i := 0; i < padlen; i++ { 9 pt = append(pt, byte(padlen)) 10 } 11 } 12 return pt 13} 14 15func EncryptString(target, keyStr string) (string) { 16 plaintext := []byte(target) 17 18 key := BlowfishChecksizeAndPad([]byte(keyStr)) 19 20 paddedplaintext := BlowfishChecksizeAndPad2(plaintext) 21 encryptedtext := BlowfishEncrypt(paddedplaintext, key) 22 23 return hex.EncodeToString(encryptedtext) 24}

こうなります。

投稿2019/04/20 07:11

編集2019/04/20 09:29
asm

総合スコア15147

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

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

asm

2019/04/20 07:15 編集

鍵長が違う場合は埋める長さが異なるかもしれません
settanaoto

2019/04/22 10:16

ありがとうございます!! おかげさまで解決できました! 時間をかけて悩んでいた問題でしたので、助かりましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問