AIを使ってサイバー犯罪の起訴状を読む
Jul 14, 2024 10:20 · 1927 words · 4 minute read
サイバーセキュリティっぽい仕事をしているので、実際の攻撃事例の参考情報として時々アメリカ司法省の起訴状を読んでいます。 起訴状には実際に起きたサイバー犯罪がどのような流れで実行されたのか書いてあるので、防御に活かすことができます。
関連URL: 今週気になったIT関連のニュース · kapieciiのブログ
そんなモチベーションでPDFとして公開された起訴状を読んでいるのですが、これがなかなか大変です。紙をScanしてPDFファイルにしているので、テキストデータを取得できず、テキストコピーからの翻訳ツールが使えません。また、法律関係の文章なので難しい単語や特徴的な言い回しが多い印象です。
というわけで長らく手で翻訳ツールに単語を入力して意味を調べながら読み進めていたのですが、LLMを使うことで革命的に効率が上がりました。 効率よく起訴状を読む方法と、試行錯誤の記録を残しておきます。この情報が同じような悩みをもつどなたかの役に立つと嬉しいです。 (2024年7月現在の情報です。)
目次
最初に結論
ChatGPTとBing AIを使うと便利です。
ChatGPTを使う
ChatGPTはOCRを使った文字起こしができます。そのため、起訴状のPDFをアップロードし、文字起こしをしてもらいます。文字起こしさえできれば、あとは日本語に翻訳してもらうもよし、内容を要約してもらうもよしです。 ざっと読みたい時にはChatGPTがおすすめです。
BingAIを使う
起訴状のPDFファイルをEdgeブラウザで開き、ブラウザ右側にあるBing Copilot Chatに質問をしながら内容を理解します。 この時会話のスタイルとして「より厳密に」を選択するのがおすすめです。
- 内容を要約してください
- 攻撃手法を解説してください
- PDFで解説されている初期侵入の手口について詳しく解説してください
など、Copilotとやり取りをしながら理解を深めます。 自分の疑問点を深堀しながら調べたい時はBingAIの方が便利です。
それぞれのAIの性能と制限事項
結論に至るまでに試した内容も記録しておきます。
ChatGPT
- 無料版の場合、使えるトークン量の制限があります。無料枠を越えると、一定期間ファイルのアップロードができません。
- Bing AIが文字起こしできない長い文章も文字起こしできます。
BingAI
- Bing Chatの画面からはPDFファイルのアップロードができません。そのため、Bing AIに起訴状のデータを渡すためにPDFを画像に変換する必要があります。
- 本記事下部のスクリプトを使いました。
- 資料のページ数が多く画像が縦長になった場合、「解像度が低いので文字起こしできません」と言われます。
- 縦に長い画像をアップロードした場合でもChatGPTでは正しく文字起こしができるので、文字起こしに関してはChatGPTの方が優秀です。
- 1ページずつ画像ファイルをアップロードした場合でも、「申し訳ありませんが、現在は短いテキストのみを読むことができます。画像に含まれるテキストは長すぎて、正確な文字起こしはできません。」と言われます。
- ファイルをアップロードした場合は「テキストの読み込みができない」と言われます。しかし、PDFファイルをEdgeで開いた状態でブラウザ右端のCopilot Chatで質問すると内容を読み込めているようです。
Claude3
- PDFファイルと画像ファイルをアップロードして文字起こしを依頼すると「OCR機能はない」と断られます。
PDFを画像にするスクリプト
検証中に作ったスクリプトです。
import os
from pdf2image import convert_from_path
from PIL import Image
def pdf_to_single_image(pdf_path, output_path, dpi=150):
pages = convert_from_path(pdf_path, dpi=dpi)
# 最初のページのサイズを取得
width, height = pages[0].size
# 全ページの高さを合計
total_height = sum(page.height for page in pages)
# 新しい画像を作成(幅は同じ、高さは全ページの合計)
combined_image = Image.new('RGB', (width, total_height))
# 各ページを新しい画像に貼り付け
y_offset = 0
for page in pages:
combined_image.paste(page, (0, y_offset))
y_offset += page.height
# 結合した画像を保存
combined_image.save(output_path)
print(f"Saved combined image to {output_path}")
pdf_path = "./data/file-name.pdf"
output_path = "./data/file-name.png"
pdf_to_single_image(pdf_path, output_path)
実行前に必要なライブラリをインストールします。
pip install pdf2image Pillow
apt update
apt install -y poppler-utils
補足情報
- 複数の画像ファイルを1つずつアップロードするのが面倒なので、複数ページのPDFファイルを1つの画像として出力します。
- ページを縦につなげるので、ページ数が多い場合は非常に縦長の画像になります。
- スクリプトの詳細は上記のGistページを参照してください。
最後に
ChatAIのおかげでこれまで大変だった情報のインプットが一気に楽になりました。 便利なものはどんどん使って効率化していきたいですね。
ChatGPTのOCRはかなり精度がいいので、これまでテキストデータにするのが難しかったデータに応用できそうです。