{"id":969,"date":"2024-07-10T10:28:32","date_gmt":"2024-07-10T01:28:32","guid":{"rendered":"https:\/\/www.tsh-world.co.jp\/adv-rd3\/?page_id=969"},"modified":"2025-05-01T13:54:41","modified_gmt":"2025-05-01T04:54:41","slug":"codecolumn6","status":"publish","type":"page","link":"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn6\/","title":{"rendered":"\u6697\u53f7\u30b3\u30e9\u30e0\u2465"},"content":{"rendered":"<section>\n<div class=\"inner\">\n<div class=\"article right\">\n<img decoding=\"async\" style=\"border:2px solid #eee; width:100%;\" src=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-content\/uploads\/sites\/19\/colum004_mini.png\" alt=\"\u6697\u53f7\u30b3\u30e9\u30e0\"><\/p>\n<h2>\u7b2c6\u56de \u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\uff1a\u7dcf\u5f53\u308a\u7bc7<\/h2>\n<div class=\"column-author\">\n\u6771\u4eac\u30b7\u30b9\u30c6\u30e0\u30cf\u30a6\u30b9\n<\/div>\n<p>&nbsp;<\/p>\n<div class=\"column-chapter\">\n<h3 id=\"\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u7121\u52b9\u3067\u3059\u77ed\u3059\u304e\u307e\u3059\">\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u7121\u52b9\u3067\u3059\u3002\u77ed\u3059\u304e\u307e\u3059\u3002<\/h3>\n<p>\u7686\u3055\u3093\u306f1\u65e5\u4f55\u56de\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3057\u307e\u3059\u304b? \u305d\u306e\u5185\u3001\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u3048\u308b\u306e\u306f\u4f55\u56de\u3042\u308a\u307e\u3059\u304b?<\/p>\n<p>\u793e\u5916\u306e\u65b9\u306b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3084\u753b\u50cf\u3092\u9001\u308b\u3068\u3044\u3046\u5834\u9762\u306f\u3088\u304f\u3042\u308a\u307e\u3059\u3002\u305d\u306e\u5185\u5bb9\u306f\u3001\u901a\u52e4\u4e2d\u306b\u898b\u304b\u3051\u305f\u91ce\u826f\u732b\u304c\u3042\u304f\u3073\u3092\u3057\u3066\u3044\u308b\u5199\u771f\u3067\u306f\u306a\u304f \u4ed5\u4e8b\u3067\u4f7f\u3046\u3088\u3046\u306a\u91cd\u8981\u306a\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3060\u3063\u305f\u308a\u8cc7\u6599\u3060\u3063\u305f\u308a\u3057\u307e\u3059\u3002\u5b89\u5168\u306b\u9001\u4ed8\u3059\u308b\u65b9\u6cd5\u3068\u3057\u3066\u3044\u304f\u3064\u304b\u65b9\u6cd5\u306f\u3042\u308a\u307e\u3059\u304c\u3001 \u300c\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304dZip\u30d5\u30a1\u30a4\u30eb\u306b\u56fa\u3081\u3066\u9001\u308b\u300d\u3068\u3044\u3046\u65b9\u6cd5\u304c\u3088\u304f\u4f7f\u308f\u308c\u308b\u624b\u6bb5\u3067\u306f\u306a\u3044\u3067\u3057\u3087\u3046\u304b\u3002\u3088\u304f\u300c\u9577\u30558\u6587\u5b57\u3067\u534a\u89d2\u82f1\u6570\u3067\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u305d\u3057\u3066\u6570\u5b57\u30921\u3064\u4ee5\u4e0a\u542b\u3080\u300d\u3068\u3044\u3063\u305f\u6307\u5b9a\u304c\u3055\u308c\u307e\u3059\u304c\u3001 \u4f55\u6545\u3053\u306e\u3088\u3046\u306a\u6307\u5b9a\u3092\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u306e\u3067\u3057\u3087\u3046\u304b\u3002\u3053\u308c\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304dZip\u30d5\u30a1\u30a4\u30eb\u3078\u306e\u653b\u6483\u306e1\u3064\u3067\u3042\u308b\u7dcf\u5f53\u308a\u653b\u6483\u3092\u9632\u3050\u305f\u3081\u306b\u5fc5\u8981\u3067\u3059\u3002\u4eca\u56de\u306f\u3001\u5b9f\u969b\u306bZip\u30d5\u30a1\u30a4\u30eb\u306b\u7dcf\u5f53\u308a\u653b\u6483\u3092\u884c\u3046\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u6210\u3057\u3066 \u4f55\u6545\u300c\u9577\u30558\u6587\u5b57\u3067\u534a\u89d2\u82f1\u6570\u3067\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u305d\u3057\u3066\u6570\u5b57\u30921\u3064\u4ee5\u4e0a\u542b\u3080\u300d\u3068\u6307\u5b9a\u304c\u3055\u308c\u308b\u306e\u304b\u3092\u5b9f\u611f\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<\/div>\n<p><!-- column-chapter--><\/p>\n<p>&nbsp;<\/p>\n<div class=\"column-chapter\">\n<h3 id=\"\u5b9f\u969b\u306b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3057\u3066\u307f\u3088\u3046\">\u5b9f\u969b\u306b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3057\u3066\u307f\u3088\u3046<\/h3>\n<p>Zip\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u30c4\u30fc\u30eb\u3068\u3057\u3066<code>John the Ripper<\/code>\u306e\u3088\u3046\u306a\u6709\u540d\u306a\u30c4\u30fc\u30eb\u3082\u3042\u308a\u307e\u3059\u304c\u3001 \u81ea\u5206\u306e\u624b\u3092\u52d5\u304b\u3057\u306a\u304c\u3089\u7dcf\u5f53\u308a\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u3092\u884c\u3046\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u3044\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u9234\u6728\u306e\u597d\u304d\u306a\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8a00\u8a9e\u3067\u3042\u308bPython\u3067\u66f8\u304d\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u306fZIP\u30d5\u30a1\u30a4\u30eb\u306e\u958b\u3051\u9589\u3081\u306b\u95a2\u3059\u308b\u90e8\u5206\u3067\u3059\u3002Python\u3067Zip\u30d5\u30a1\u30a4\u30eb\u3092\u6271\u3046<code>zipfile<\/code>\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u3042\u308a\u307e\u3059\u3002<code>ZipFile.extractall<\/code>\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u5f15\u6570<code>pwd<\/code>\u306b\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u30d0\u30a4\u30ca\u30ea\u5217\u3068\u3057\u3066\u6e21\u3057\u307e\u3059\u3002\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u306a\u3044\u5834\u5408\u306f\u3001<code>RuntimeError<\/code>\u304c\u9001\u51fa\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u30d0\u30a4\u30ca\u30ea\u5217\u3092\u6e21\u3059\u306e\u306f\u9762\u5012\u306a\u306e\u3067\u3001\u4f7f\u3044\u3084\u3059\u3044\u3088\u3046\u306b\u95a2\u6570\u3068\u3057\u3066\u66f8\u3044\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"sourceCode python\"><code class=\"sourceCode python\"><span class=\"kw\">def<\/span> extract_zip(path_to_zipfile, password=<span class=\"st\">&quot;&quot;<\/span>):\n    <span class=\"co\">&quot;&quot;&quot;&quot;\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066ZIP\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u51cd\u3059\u308b<\/span>\n\n<span class=\"co\">    \u5f15\u6570password\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u5024\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u306a\u3057\u306b\u8a72\u5f53\u3059\u308b\u3002<\/span>\n<span class=\"co\">    &quot;&quot;&quot;<\/span>\n    <span class=\"kw\">with<\/span> zipfile.ZipFile(path_to_zipfile, <span class=\"st\">&#39;r&#39;<\/span>) <span class=\"ch\">as<\/span> zf:\n        zf.extractall(dest, pwd=password.encode())<\/code><\/pre>\n<p>Python\u30d7\u30ed\u30b0\u30e9\u30e0\u3067Zip\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u6790\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"sourceCode python\"><code class=\"sourceCode python\">extract_zip(<span class=\"st\">&quot;hoge.zip&quot;<\/span>)\nextract_zip(<span class=\"st\">&quot;encrypted_hoge.zip&quot;<\/span>, password=<span class=\"st\">&quot;hoge&quot;<\/span>)<\/code><\/pre>\n<p>\u306e\u3088\u3046\u306b\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<p>\u3067\u306f\u65e9\u901f\uff65\uff65\uff65\u3068\u884c\u304d\u305f\u3044\u3068\u3053\u308d\u3067\u3059\u304c\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u30921\u30641\u3064\u624b\u5165\u529b\u3059\u308b\u306e\u306f\u9762\u5012\u3067\u3059\u3088\u306d\u3002\u5019\u88dc\u3068\u306a\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u751f\u6210\u304b\u3089\u5165\u529b\u307e\u3067\u3082\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u81ea\u52d5\u5316\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u5019\u88dc\u3068\u306a\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u751f\u6210\u3059\u308b\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002Python\u306e\u6a19\u6e96\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3042\u308b<code>itertools<\/code>\u3092\u4f7f\u3044\u307e\u3059\u3002<code>itetools.product<\/code>\u306f\u5f15\u6570\u3068\u3057\u3066\u6e21\u3057\u305f\u30a4\u30c6\u30e9\u30d6\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u76f4\u7a4d\u3092\u305f\u3069\u308b\u30a4\u30c6\u30ec\u30fc\u30bf\u3092\u751f\u6210\u3057\u307e\u3059\u3002\u30ad\u30fc\u30ef\u30fc\u30c9\u5f15\u6570<code>repeat<\/code>\u306b\u6570\u3092\u6e21\u3059\u3053\u3068\u3067\u30a4\u30c6\u30e9\u30d6\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u81ea\u8eab\u306e\u76f4\u7a4d\u3092\u305f\u3069\u308b\u30a4\u30c6\u30ec\u30fc\u30bf\u3092\u751f\u6210\u3057\u307e\u3059\u3002<code>itertools.product(&quot;abc&quot;, repeat=2)<\/code>\u3068\u3059\u308b\u3068\u3001<code>a<\/code>\u3001<code>b<\/code>\u3001<code>c<\/code>\u306e\u4e2d\u304b\u3089\u91cd\u8907\u3092\u542b\u30802\u3064\u306e\u6587\u5b57\u306e\u30bf\u30d7\u30eb\u304c\u8fd4\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"sourceCode python\"><code class=\"sourceCode python\"><span class=\"ch\">import<\/span> itertools\n\n<span class=\"kw\">for<\/span> word in itertools.product(<span class=\"st\">&quot;abc&quot;<\/span>, repeat=<span class=\"dv\">2<\/span>):\n    <span class=\"dt\">print<\/span>(word)<\/code><\/pre>\n<p>\u5b9f\u884c\u7d50\u679c\u306f\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><code>(&#39;a&#39;, &#39;a&#39;)\n(&#39;a&#39;, &#39;b&#39;)\n(&#39;a&#39;, &#39;c&#39;)\n(&#39;b&#39;, &#39;a&#39;)\n(&#39;b&#39;, &#39;b&#39;)\n(&#39;b&#39;, &#39;c&#39;)\n(&#39;c&#39;, &#39;a&#39;)\n(&#39;c&#39;, &#39;b&#39;)\n(&#39;c&#39;, &#39;c&#39;)<\/code><\/pre>\n<p>\u305f\u3057\u304b\u306b\u3001\u6b32\u3057\u304b\u3063\u305f\u3082\u306e\u304c\u51fa\u529b\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u5f8c\u306f\u3001<code>&quot;abc&quot;<\/code>\u306e\u4ee3\u308f\u308a\u306b\u751f\u6210\u3059\u308b\u6587\u5b57\u5217\u3092\u6e21\u305b\u3070\u3059\u3079\u3066\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u7d44\u307f\u5408\u308f\u305b\u304c\u751f\u6210\u3067\u304d\u305d\u3046\u3067\u3059\u306d\u3002\u5148\u7a0b\u306e<code>extract_zip<\/code>\u3068\u7d44\u307f\u5408\u308f\u305b\u3066\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u89e3\u6790\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"sourceCode python\"><code class=\"sourceCode python\"><span class=\"kw\">def<\/span> crack_password(path_to_zipfile, target_chars, length):\n    <span class=\"co\">&quot;&quot;&quot;&quot;\u7dcf\u5f53\u308a\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3059\u308b&quot;&quot;&quot;<\/span>\n    target_iter = itertools.chain([<span class=\"st\">&quot;&quot;<\/span>], itertools.product(target_chars, repeat=length))\n    <span class=\"kw\">for<\/span> challenge in target_iter:\n        <span class=\"kw\">try<\/span>:\n            password = <span class=\"st\">&quot;&quot;<\/span>.join(challenge).encode()\n            extract_zip(path_to_zipfile, challenge)\n            <span class=\"dt\">print<\/span>(<span class=\"st\">&#39;PASS:&#39;<\/span>, <span class=\"st\">&quot;&quot;<\/span>.join(challenge))\n            <span class=\"kw\">break<\/span>\n        <span class=\"kw\">except<\/span> <span class=\"ot\">RuntimeError<\/span>:\n            <span class=\"kw\">pass<\/span><\/code><\/pre>\n<p><code>target_iter<\/code>\u306b\u5bfe\u8c61\u3068\u306a\u308b\u6587\u5b57\u304b\u3089\u306a\u308b\u5168\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u305f\u3069\u308b\u30a4\u30c6\u30ec\u30fc\u30bf\u3092\u4ee3\u5165\u3057\u307e\u3059\u3002\u3042\u3068\u306f\u30011\u30641\u3064\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u6697\u53f7\u5316\u3055\u308c\u305fZip\u30d5\u30a1\u30a4\u30eb\u304c\u89e3\u51cd\u3067\u304d\u308b\u304b\u3092\u78ba\u304b\u3081\u307e\u3059\u3002\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u306a\u3044\u5834\u5408\u306f\u3001<code>RuntimeError<\/code>\u304c\u9001\u51fa\u3055\u308c\u308b\u305f\u3081\u3001<code>try-except<\/code>\u6587\u3067\u30ad\u30e3\u30c3\u30c1\u3057\u3001 \u6b21\u306e\u6587\u5b57\u3092\u8a66\u3059\u3088\u3046\u306b\u4ed5\u639b\u3051\u307e\u3059\u3002<\/p>\n<p>\u4f7f\u3044\u3084\u3059\u304f\u306a\u308b\u3088\u3046\u306b\u3001\u6a19\u6e96\u30e2\u30b8\u30e5\u30fc\u30eb\u306e<code>argparse<\/code>\u3092\u4f7f\u3044\u3064\u3064\u3061\u3087\u3063\u3068\u3057\u305f\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u30c4\u30fc\u30eb\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u30d5\u30a1\u30a4\u30eb\u540d\u306f<code>zip_password_cracker.py<\/code>\u3068\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre class=\"sourceCode python\"><code class=\"sourceCode python\"><span class=\"ch\">import<\/span> argparse\n<span class=\"ch\">import<\/span> itertools\n<span class=\"ch\">import<\/span> os\n<span class=\"ch\">import<\/span> string\n<span class=\"ch\">import<\/span> sys\n<span class=\"ch\">import<\/span> zipfile\n\n\n<span class=\"kw\">def<\/span> create_parser():\n    <span class=\"co\">&quot;&quot;&quot;\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u5f15\u6570\u306e\u30d1\u30fc\u30b5\u30fc\u3092\u4f5c\u6210\u3059\u308b&quot;&quot;&quot;<\/span>\n    parser = argparse.ArgumentParser(description=<span class=\"st\">&#39;Password Cracker for ZIP archived file.&#39;<\/span>,\n                                     epilog=<span class=\"st\">&quot;If you don&#39;t use optional arguments, target set is upper case and lower case (A-Za-z).&quot;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;zipfile&quot;<\/span>, action=<span class=\"st\">&#39;store&#39;<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;zipfile&#39;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;length&quot;<\/span>, action=<span class=\"st\">&#39;store&#39;<\/span>, <span class=\"dt\">type<\/span>=<span class=\"dt\">int<\/span>, default=<span class=\"dv\">5<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;the length of password. Default value is 5.&#39;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;-d&quot;<\/span>, <span class=\"st\">&quot;--digits&quot;<\/span>, action=<span class=\"st\">&#39;store_true&#39;<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;append digits to target set.&#39;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;-l&quot;<\/span>, <span class=\"st\">&quot;--lower&quot;<\/span>, action=<span class=\"st\">&#39;store_true&#39;<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;append lower case to target set.&#39;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;-p&quot;<\/span>, <span class=\"st\">&quot;--punctuation&quot;<\/span>, action=<span class=\"st\">&#39;store_true&#39;<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;append punctuation to target set.&#39;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;-u&quot;<\/span>, <span class=\"st\">&quot;--upper&quot;<\/span>, action=<span class=\"st\">&#39;store_true&#39;<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;append upper case to target set.&#39;<\/span>)\n    parser.add_argument(<span class=\"st\">&quot;-w&quot;<\/span>, <span class=\"st\">&quot;--white&quot;<\/span>, action=<span class=\"st\">&#39;store_true&#39;<\/span>, <span class=\"dt\">help<\/span>=<span class=\"st\">&#39;append whitespace to target set.&#39;<\/span>)\n    <span class=\"kw\">return<\/span> parser\n\n\n<span class=\"kw\">def<\/span> create_target_strings(args):\n    <span class=\"co\">&quot;&quot;&quot;\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u5f15\u6570\u304b\u3089\u89e3\u6790\u5bfe\u8c61\u3068\u306a\u308b\u6587\u5b57\u5217\u3092\u7d44\u307f\u7acb\u3066\u308b&quot;&quot;&quot;<\/span>\n    target_chars = <span class=\"st\">&quot;&quot;<\/span>\n    <span class=\"kw\">if<\/span> not <span class=\"dt\">any<\/span>((args.digits, args.lower, args.punctuation, args.upper, args.white)):\n        target_chars = string.ascii_lowercase + string.ascii_uppercase\n    <span class=\"kw\">else<\/span>:\n        <span class=\"kw\">if<\/span> args.digits:\n            target_chars += string.digits\n        <span class=\"kw\">if<\/span> args.lower:\n            target_chars += string.ascii_lowercase\n        <span class=\"kw\">if<\/span> args.punctuation:\n            target_chars += string.punctuation\n        <span class=\"kw\">if<\/span> args.upper:\n            target_chars += string.ascii_uppercase\n        <span class=\"kw\">if<\/span> args.white:\n            target_chars += string.whitespace\n    <span class=\"kw\">return<\/span> target_chars\n\n\n<span class=\"kw\">def<\/span> extract_zip(args, target_chars):\n    <span class=\"co\">&quot;&quot;&quot;&quot;\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066ZIP\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u51cd\u3059\u308b<\/span>\n\n<span class=\"co\">    \u5f15\u6570password\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u5024\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u306a\u3057\u306b\u8a72\u5f53\u3059\u308b\u3002<\/span>\n<span class=\"co\">    &quot;&quot;&quot;<\/span>\n    <span class=\"kw\">with<\/span> zipfile.ZipFile(args.zipfile, <span class=\"st\">&#39;r&#39;<\/span>) <span class=\"ch\">as<\/span> zf:\n        zf.extractall(os.path.splitext(sys.argv[<span class=\"dv\">1<\/span>])[<span class=\"dv\">0<\/span>], pwd=password.encode())\n\n\n<span class=\"kw\">def<\/span> crack_password(args, target_chars):\n    <span class=\"co\">&quot;&quot;&quot;&quot;\u7dcf\u5f53\u308a\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3059\u308b&quot;&quot;&quot;<\/span>\n    target_iter = itertools.chain([<span class=\"st\">&quot;&quot;<\/span>], itertools.product(target_chars, repeat=args.length))\n    <span class=\"kw\">for<\/span> challenge in target_iter:\n        <span class=\"kw\">try<\/span>:\n            password = <span class=\"st\">&quot;&quot;<\/span>.join(challenge).encode()\n            extract_zip(args, challenge)\n            <span class=\"dt\">print<\/span>(<span class=\"st\">&#39;PASS:&#39;<\/span>, <span class=\"st\">&quot;&quot;<\/span>.join(challenge))\n            <span class=\"kw\">break<\/span>\n        <span class=\"kw\">except<\/span> <span class=\"ot\">KeyboardInterrupt<\/span>:\n            <span class=\"dt\">print<\/span>(<span class=\"st\">&quot;KeyboardInterrupt&quot;<\/span>)\n            <span class=\"kw\">break<\/span>\n        <span class=\"kw\">except<\/span> <span class=\"ot\">RuntimeError<\/span>:\n            <span class=\"kw\">pass<\/span>\n\n\n<span class=\"kw\">def<\/span> main():\n    <span class=\"co\">&quot;&quot;&quot;\u4e00\u9023\u306e\u52d5\u4f5c\u3092\u9806\u306b\u5b9f\u884c\u3059\u308b&quot;&quot;&quot;<\/span>\n\n    parser = create_parser()\n    args = parser.parse_args()\n    target_chars = create_target_strings(args)\n    crack_password(args, target_chars)\n\n\n<span class=\"kw\">if<\/span> <span class=\"ot\">__name__<\/span> == <span class=\"st\">&#39;__main__&#39;<\/span>:\n    main()<\/code><\/pre>\n<p>\u4f7f\u3044\u65b9\u306f\u3001<code>python zip_password_cracker.py --help<\/code>\u3068\u3059\u308b\u3068\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre><code>$&gt; python zip_password_cracker.py --help\nusage: zip_password_cracker.py [-h] [-d] [-l] [-p] [-u] [-w] zipfile length\n\nPassword Cracker for ZIP archived file.\n\npositional arguments:\n  zipfile            zipfile\n  length             the length of password. Default value is 5.\n\noptional arguments:\n  -h, --help         show this help message and exit\n  -d, --digits       append digits to target set.\n  -l, --lower        append lower case to target set.\n  -p, --punctuation  append punctuation to target set.\n  -u, --upper        append upper case to target set.\n  -w, --white        append whitespace to target set.\n\nIf you don&#39;t use optional arguments, target set is upper case and lower case (A-Za-z).<\/code><\/pre>\n<p>\u3044\u3044\u611f\u3058\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u89e3\u6790\u5bfe\u8c61\u306e\u6587\u5b57\u5217\u3092\u5236\u5fa1\u3067\u304d\u308b\u306e\u306f\u30a4\u30ab\u3057\u3066\u3044\u307e\u3059\u306d\u3002<\/p>\n<pre><code>$&gt; python zip_password_cracker.py encrypted_zipfile.zip 4<\/code><\/pre>\n<p>\u3068\u3059\u308c\u3070\u9577\u30554\u306e\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u304b\u3089\u306a\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u7dcf\u5f53\u308a\u3067\u89e3\u6790\u3067\u304d\u307e\u3059\u3002\u3059\u3070\u3089\u3057\u3044\u3067\u3059\u306d\u3002<\/p>\n<\/div>\n<p><!-- column-chapter--><\/p>\n<p>&nbsp;<\/p>\n<div class=\"column-chapter\">\n<h3 id=\"\u3067\u305d\u306e\u30c4\u30fc\u30eb\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u306b\u304a\u3044\u3066\u4f55\u306e\u30e1\u30ea\u30c3\u30c8\u304c\u3042\u308b\u3068\u304a\u8003\u3048\u3067\u3059\u304b\">&#8230;\u3067\u3001\u305d\u306e\u30c4\u30fc\u30eb\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u306b\u304a\u3044\u3066\u4f55\u306e\u30e1\u30ea\u30c3\u30c8\u304c\u3042\u308b\u3068\u304a\u8003\u3048\u3067\u3059\u304b\uff1f<\/h3>\n<p>\u3055\u3042\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u30c4\u30fc\u30eb\u3055\u3048\u3042\u308c\u3070\u4e16\u306e\u4e2d\u306eZip\u30d5\u30a1\u30a4\u30eb\u306f\u4ffa\u306e\u3082\u306e\u3060\uff01 \u3068\u3044\u3046\u91ce\u671b\u3092\u3082\u3057\u62b1\u304b\u305b\u3066\u3057\u307e\u3063\u305f\u306e\u3067\u3042\u308c\u3070\u307e\u3053\u3068\u306b\u7533\u3057\u8a33\u3042\u308a\u307e\u305b\u3093\u3002\u7dcf\u5f53\u308a\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u3092\u884c\u3048\u3070\u3044\u3064\u304b\u306f\u308f\u304b\u308a\u307e\u3059\u304c\u3001\u554f\u984c\u306f\u3044\u3064\u308f\u304b\u308b\u306e\u304b\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002\u78ba\u304b\u306b\u30014\u6587\u5b57\u3050\u3089\u3044\u3060\u3068\u73fe\u5b9f\u7684\u306a\u6642\u9593\u3067\u7834\u3089\u308c\u3066\u3057\u307e\u3046\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u30a2\u30eb\u30d5\u30a1\u30d9\u30c3\u30c8\u5c0f\u6587\u5b57\u5927\u6587\u5b57\u3001\u6570\u5b57\u304b\u3089\u306a\u308b\u5834\u5408\u3092\u8003\u3048\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u4f7f\u7528\u3067\u304d\u308b\u306f62\u6587\u5b57\u3042\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li>\u30d1\u30b9\u30ef\u30fc\u30c9\u304c1\u6587\u5b57\u306e\u5834\u5408\u3001\u8003\u3048\u3089\u308c\u308b\u53ef\u80fd\u6027\u306f62\u901a\u308a\u3067\u3059\u306d\u3002<\/li>\n<li>2\u6587\u5b57\u306e\u5834\u5408\u30011\u6587\u5b57\u306726\u901a\u308a\u30012\u6587\u5b57\u76ee\u306726\u901a\u308a\u305d\u308c\u305e\u308c\u53ef\u80fd\u6027\u304c\u3042\u308b\u306e\u3067 62 \u00d7\u300062 = 3844\u901a\u308a\u3067\u3059\u3002<\/li>\n<li>3\u6587\u5b57\u306e\u5834\u5408\u30011\u6587\u5b57\u76ee\u304b\u30893\u6587\u5b57\u76ee\u307e\u3067\u305d\u308c\u305e\u308c\u306b\u304a\u3044\u306662\u901a\u308a\u306e\u53ef\u80fd\u6027\u304c\u3042\u308b\u306e\u306762 \u00d7\u300062 \u00d7\u300062 = 238328\u901a\u308a\u3067\u3059\u3002<\/li>\n<\/ul>\n<p>\u3053\u308c\u3089\u306e\u4f8b\u304b\u3089\u3082\u308f\u304b\u308b\u3088\u3046\u306b\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u9577\u3055\u304c\u9577\u304f\u306a\u308b\u307b\u3069\u6025\u6fc0\u306b\u5897\u3048\u308b\u306e\u3067\u3059\u3002\u6587\u5b57\u306e\u7a2e\u985e c \u306e \u9577\u3055 n \u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u3059\u3079\u3066\u306e\u7d44\u307f\u5408\u308f\u305b\u306f c<sup>n<\/sup>\u3068\u306a\u308a\u307e\u3059\u3002\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u7d44\u307f\u5408\u308f\u305b\u306f\u9577\u3055\u306b\u95a2\u3059\u308b\u6307\u6570\u95a2\u6570\u7684\u306b\u6025\u6fc0\u306b\u5897\u3048\u3066\u3057\u307e\u3046\u306e\u3067\u3059\u3002<\/p>\n<p>\u4f8b\u3048\u3070\u3001\u300c\u9577\u30558\u6587\u5b57\u3067\u534a\u89d2\u82f1\u6570\u3067\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u305d\u3057\u3066\u6570\u5b57\u30921\u3064\u4ee5\u4e0a\u542b\u3080\u300d\u306e\u5834\u5408\u3001 \u6587\u5b57\u306e\u7a2e\u985e\u306f62\u7a2e\u985e\u3001\u9577\u3055\u306f\u77ed\u304f\u3066\u30828\u3068\u306a\u308a\u307e\u3059\u306e\u3067 62<sup>8<\/sup> = 218340105584896\u3001\u7d04200\u5146\u901a\u308a\u3082\u3042\u308a\u307e\u3059\u30021\u3064\u306e\u30d1\u30bf\u30fc\u30f3\u30921\u30df\u30ea\u79d2\u3067\u30c1\u30a7\u30c3\u30af\u3067\u304d\u305f\u3068\u3057\u3066\u3082\u7d047000\u5e74\u304b\u304b\u308a\u307e\u3059\u3002\u56fd\u306e\u4e00\u822c\u4f1a\u8a08\u4e88\u7b97\u3088\u308a\u3082\u591a\u3044\u5168\u3066\u306e\u7d44\u307f\u5408\u308f\u305b\u3092\u3059\u3079\u3066\u30c1\u30a7\u30c3\u30af\u3059\u308b\u306e\u306f\u975e\u73fe\u5b9f\u3067\u3059\u3002\u81a8\u5927\u306a\u6642\u9593\u3092\u304b\u3051\u3066\u89e3\u8aad\u3057\u305f\u7d50\u679c\u3001\u64ae\u5f71\u8005\u304c\u901a\u52e4\u4e2d\u306b\u898b\u304b\u3051\u305f\u91ce\u826f\u732b\u304c\u3042\u304f\u3073\u3092\u3057\u3066\u3044\u308b\u5199\u771f\u3060\u3063\u305f\u65e5\u306b\u306f\u76ee\u3082\u5f53\u3066\u3089\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b\u3001\u5168\u901a\u308a\u3092\u8a66\u3059\u65b9\u6cd5\u306f\u78ba\u5b9f\u306a\u65b9\u6cd5\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u5b9f\u884c\u3059\u308b\u306e\u306f\u96e3\u3057\u3044\u306e\u3067\u3059\u3002\u300c\u9577\u30558\u6587\u5b57\u3067\u534a\u89d2\u82f1\u6570\u3067\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u305d\u3057\u3066\u6570\u5b57\u30921\u3064\u4ee5\u4e0a\u542b\u3080\u300d\u3068\u3059\u308c\u3070\u3001\u7dcf\u5f53\u308a\u653b\u6483\u306b\u5bfe\u6297\u3067\u304d\u307e\u3059\u3002\u4ed6\u306eZip\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u306e\u624b\u6bb5\u306f\u3042\u308b\u306e\u304b\uff1f\u6b21\u56de\u306f\u3082\u3046\u5c11\u3057\u73fe\u5b9f\u7684\u306a\u653b\u6483\u624b\u6cd5\u3092\u691c\u8a0e\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<\/div>\n<div class=\"clear\"><\/div>\n<\/div>\n<div class=\"sidebar\" id=\"sidebar\">\n<div class=\"widget\">\n<h3>\u6700\u65b0\u8a18\u4e8b<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn\/\">\u7b2c7\u56de \u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\uff1a\u8f9e\u66f8\u653b\u6483\uff06\u985e\u63a8\u653b\u6483\u7bc7<\/a><\/li>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn6\/\">\u7b2c6\u56de \u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\uff1a\u7dcf\u5f53\u308a\u7bc7<\/a><\/li>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn5\/\">\u7b2c5\u56de \u6e96\u540c\u578b\u6697\u53f7 -\u79d8\u5bc6\u306b\u3057\u305f\u307e\u307e\u8a08\u7b97\u3067\u304d\u308b\u6697\u53f7-<\/a><\/li>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn4\/\">\u7b2c4\u56de RSA\u6697\u53f7 \u5f8c\u7de8\uff1a\u305d\u3057\u3066RSA\u6697\u53f7\u3078\u2026<\/a><\/li>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn3\/\">\u7b2c3\u56de RSA\u6697\u53f7 \u524d\u7de8\uff1a2\u304b\u3051\u308b3\u306f1\u30013\u308f\u308b4\u306f2<\/a><\/li>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn2\/\">\u7b2c2\u56de \u516c\u958b\u9375\u6697\u53f7\u3068\u79d8\u5bc6\u306e\u901a\u4fe1<\/a><\/li>\n<li><a href=\"https:\/\/www.tsh-world.co.jp\/adv-rd\/labo\/codecolumn1\/\">\u7b2c1\u56de \u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3068\u306f\u4f55\u304b<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>\u6771\u4eac\u30b7\u30b9\u30c6\u30e0\u30cf\u30a6\u30b9\u306e\u7814\u7a76\u54e1\u304c\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\uff08\u6697\u53f7\uff09\u306e\u4e16\u754c\u3092\u5b9f\u4f8b\u3092\u4ea4\u3048\u3066\u30b3\u30e9\u30e0\u3092\u57f7\u7b46\u3057\u3066\u3044\u307e\u3059\u3002\u4eca\u56de\u306e\u30c6\u30fc\u30de\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u89e3\u6790\u3067\u3059\u3002\u5b9f\u969b\u306e\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u4e8b\u4f8b\u3092\u4ea4\u3048\u3001\u3054\u8aac\u660e\u3057\u3066\u304a\u308a\u307e\u3059<\/p>\n","protected":false},"author":8,"featured_media":0,"parent":549,"menu_order":11,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-969","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/pages\/969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/comments?post=969"}],"version-history":[{"count":11,"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/pages\/969\/revisions"}],"predecessor-version":[{"id":1211,"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/pages\/969\/revisions\/1211"}],"up":[{"embeddable":true,"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/pages\/549"}],"wp:attachment":[{"href":"https:\/\/www.tsh-world.co.jp\/adv-rd\/wp-json\/wp\/v2\/media?parent=969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}