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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

536閲覧

CTFの勉強中にHMAC-SHA1のサンプルコードに遭遇し、中身の処理でわからないところがあり、質問させていただきます。

Utas

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/04/30 07:43

前提

CTFの勉強中にHMAC-SHA1のサンプルコードに遭遇し、中身の処理でわからないところがあり、質問させていただきます。

該当のソースコードhmac_sha1.py

from hashlib import sha1 from binascii import hexlify BLOCK_SIZE = 64 # ハッシュ関数のブロック ipad = b'\x36' * BLOCK_SIZE opad = b'\x5c' * BLOCK_SIZE def xor(s1, s2): return bytes([ a ^ b for a, b in zip(s1, s2) ]) def hmac_sha1(key, msg): if len(key) > BLOCK_SIZE: key = sha1(key).digest() key = key + b'\x00' * (BLOCK_SIZE - len(key)) k_opad = xor(key, opad) k_ipad = xor(key, ipad) return sha1(k_opad + sha1(k_ipad + msg).digest()) print(hmac_sha1(b'secretkey', b'somedata').hexdigest()) # => b9a7a9d5256a599d69f09586278e046ce6430254

質問したい点

ソースコードの下記の部分の「a ^ b」で何をしているのか、わかりません。

def xor(s1, s2): return bytes([ a ^ b for a, b in zip(s1, s2) ])

そもそもaとbはどこからでてきたのでしょうか?
pythonを普段触らないので、初歩的な質問かもしれませんがお答えいただけると幸いです。

補足情報

使用している教材 「セキュリティコンテストCTFで学ぶ脆弱性攻略の技術」

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

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

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

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

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

guest

回答2

0

自己解決

解決したこと

[ a ^ b for a, b in zip(s1, s2) ]

上記コードはリスト内包表記である。

投稿2022/04/30 14:13

編集2022/05/01 05:02
Utas

総合スコア12

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

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

Zuishin

2022/05/01 00:32 編集

そうですね。しかしその前後の角カッコも含めてください。
Utas

2022/05/01 05:03

そうですね。リストですからカッコも入れてリスト内包表記ですね。 最後までご指摘ありがとうございます。
guest

0

「a ^ b」で何をしているのか、わかりません。

「^」を検索してください。Googleでは記号は検索できない場合も多いですが「^」は検索できるようです。
Google検索「^」
また、Wikipediaも有用です。
Wikipedia「^」(「サーカムフレックス」へリダイレクト)
文字の名前が分かれば言語名と合わせて検索すると良い結果が得られる場合も多いです。

そもそもaとbはどこからでてきたのでしょうか?

文中の「for ~ in」や「,」や「zip(~)」の意味を調べてください。for ~ inやzipは英単語なので記号より検索しやすいはずです。
ただ、pythonの「,」は検索しづらい上に他言語であまり見ない機能なので少々辿り着きづらいかもしれません。
「python カンマ タプル」あたりで検索するとよいかなと思います。

(訂正)「a , b」をタプルの宣言かと誤解していました。これはzip()から返されたタプルを「a」と「b」にアンパック代入する処理でした。すみませんでした。

投稿2022/04/30 08:20

編集2022/05/01 06:45
ikadzuchi

総合スコア3047

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

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

Utas

2022/04/30 08:33

ご返信ありがとうございます。 既に調べたことを書き忘れていました。 ^はpythonでは排他的論理和を表し、「for - in」は繰り返し処理、「zip()」は複数リストの結合という認識でした。 今、返信を考えながら、頭の整理ができてこの文の意味がわかった気がします。 s1,s2という二つのバイト列の排他的論理和を返すということですかね?
Zuishin

2022/04/30 12:03

そんな些事より先にリスト内包表記を説明すべきです。 > そもそもaとbはどこからでてきたのでしょうか?
Zuishin

2022/04/30 12:05

で、タプルを調べさせようとしていますが、どれがタプルなんですか?
Utas

2022/04/30 14:10

Zuishinさん。コメントありがとうございます。 リスト内包表記ですね。参考になりました。ありがとうございます。
ikadzuchi

2022/04/30 16:41

> 今、返信を考えながら、頭の整理ができてこの文の意味がわかった気がします。 それはよかったです。 > s1,s2という二つのバイト列の排他的論理和を返すということですかね? たぶん正しく認識していると思います。 > そんな些事より先にリスト内包表記を説明すべきです。 そうですか。そう思うのでしたら回答をするとよいです。 私は今回は説明はせず調べるべき対象を示すだけに留めているので、説明はしません。その上で、リスト内包表記含め理解すべき概念に辿り着くために十分な情報を与えているつもりです。 > で、タプルを調べさせようとしていますが、どれがタプルなんですか? 「a, b」はタプルだと認識していますが、違いますでしょうか。
Zuishin

2022/04/30 23:04

回答しなくても、質問者さんはその一言でわかったので、あなたも調べてみたら何を言われたのかわかるかもしれません。 > 「a, b」はタプルだと認識していますが、違いますでしょうか。 アンパック代入です。次のように書いてあればタプルです。 for a in zip(s1, s2)
ikadzuchi

2022/05/01 06:41

> 回答しなくても、質問者さんはその一言でわかったので、あなたも調べてみたら何を言われたのかわかるかもしれません。 自分の考えが絶対の真実で説明せずに皆わかるはずというふざけた考えをいい加減捨ててください。 > アンパック代入です。 言われてみればそうですね。勘違いしていました。ご指摘ありがとうございます。
Zuishin

2022/05/02 03:17 編集

> 自分の考えが絶対の真実で説明せずに皆わかるはずというふざけた考えをいい加減捨ててください。 まあ、あなたにわからなかったらわからなかったで、私は別にどうでもいいので、調べなくても構いません。 ただ、この質問に回答するにはリスト内包表記が必須です。 現にあなたは、 > 文中の「for ~ in」や「,」や「zip(~)」の意味を調べてください。 と書いています。これを調べて出てくるのは for 文である可能性も高いですね。というより、この書き方やその後の応答を見ると、for 文のことを言っているようにしか見えません。 for 文はまた構文が違うので、質問者さんを混乱させただけに終わったかもしれません。 つまり、リスト内包表記を知らない人が、目についた単語を並べて「調べろ」と投げているだけで、 > その上で、リスト内包表記含め理解すべき概念に辿り着くために十分な情報を与えているつもりです。 ということには全然なっていません。 「豆腐」の意味を聞いている人に「豆」と「腐」を調べろと言っているようなものです。
ikadzuchi

2022/05/10 17:36

> まあ、あなたにわからなかったらわからなかったで、私は別にどうでもいいので、調べなくても構いません。 ええと? なぜ私が調べる話になっているんです? あなたが何か言いたげなので言ってみろと言っているんですよ。 > ただ、この質問に回答するにはリスト内包表記が必須です。 同じことを繰り返しても会話にはならないのですが。 あなたが必須だと思っていることを私は否定しませんし(私は必須とまでは思いませんが)、リスト内包表記含め理解すべき概念に辿り着くために十分な情報を与えているつもりだと言っていますよね? > 現にあなたは、~と書いています。 何が言いたいのか分かりません。私がリスト内包表記を伝えようとしていると思っているのかそうでないのかはっきりしてください。 > これを調べて出てくるのは for 文である可能性も高いですね。~質問者さんを混乱させただけに終わったかもしれません。 ええ、分かるかもしれないし分からないかもしれないのは当然です。 その上で、分かる可能性は十分高いと思うし、これ以上答えに近い内容を示すべきではないと考えての回答です。(もちろんあなたのように答えを示すべきという考えを否定はしません) > つまり、リスト内包表記を知らない人が、~なっていません。 あなたの感想はそうなんですね。私はそう考えていないし何を示してもあなたが納得するわけでもないのでどうでもいいです。 > 「豆腐」の意味を聞いている人に「豆」と「腐」を調べろと言っているようなものです。 またお得意のズレた例え話ですか? 正直「豆腐」と「豆」と「腐」で何を例えたつもりなのか分からないので説明してもらっていいですか? いややっぱりいいです。お得意の話題ずらしに乗るところでした。
ikadzuchi

2022/05/10 17:36

あーくそなんでこんなゴミに時間取られなきゃいけないんだよクソクソクソ
Zuishin

2022/05/15 11:21

あなたがゴミみたいなことしか書いてないのは、いつものことじゃないですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問