#author("2020-07-22T12:06:34+09:00","default:nobuoki","nobuoki")
#author("2020-07-22T12:07:21+09:00","default:nobuoki","nobuoki")
例えば slack で言いづらいことを暗号化(難読化)して分かる奴だけに伝えたい時ってありますよね?
(だったらDMしろよ!という声が聞こえなくも無いですが・・・)

 るあてっはでテムガに
 らうのータニモはギカ
 のえくづでそ

これは単に rev | fold しただけなのでバレバレですが、
もうちょっと簡単に難読化したいですよね?

 嚮囑囈嘲嘛圄壓壙圉坡奢夥倬圄嗾唳囹壑埀奕囑圉囃囎嗔喙

何と nkf -r で出来ます!

#prism(bash){{
$ echo 'そでづくえのカギはモニターのうらにガムテではってある' | nkf -r
嚮囑囈嘲嘛圄壓壙圉坡奢夥倬圄嗾唳囹壑埀奕囑圉囃囎嗔喙

$ echo 'そでづくえのカギはモニターのうらにガムテではってある' | nkf -r | nkf -r
そでづくえのカギはモニターのうらにガムテではってある
}}

漢字は変換時に欠落することがあるので、ひらがな、カタナカのみがお勧めです
ぜひスラッシュコマンドに登録しておきましょう(←しない)

** 余談 [#w6b3b513]

rot13は普通 a-zA-Z の変換を指しますよね

#prism(bash){{{
# マルチバイト文字はそのまま
$ python -c 'import codecs; print(codecs.encode("海賊王にoreはなる!", "rot-13"))'
海賊王にberはなる!
}}}

で、たまたま [[ROT13 - Qiita>https://qiita.com/STomohiko/items/ff23b001b986015e9691]] を眺めてたところ
nkf -r と書いてあるのを見つけ、何このオプションと思ったら

#prism(bash){{{
$ man nkf | grep -wF -- -r
       -r  ROT13/47 の変換をする。
}}}

で、試しにやってみたら

#prism(bash){{{
$ echo "海賊王にoreはなる!" | nkf -r
瞋騾疸囹ber圉囮喙!
}}}

すげー!
と思ったのも束の間、

#prism(bash){{{
# 欠ける例
$ echo 袖机の鍵はモニターの裏にガムテで貼ってある | nkf -r | nkf -r
袖机の鍵はモニターのにガムテでってある
}}}

でもほら、ひらがな、カタカナがセーフならいいじゃん、と思いチェックしてみる
でもまぁ、ひらがな、カタカナがセーフならいいじゃん、と思いチェックしてみる
- [[Hiragana (Unicode block) - Wikipedia>https://en.wikipedia.org/wiki/Hiragana_%28Unicode_block%29]]
- [[Katakana (Unicode block) - Wikipedia>https://en.wikipedia.org/wiki/Katakana_%28Unicode_block%29]]

#prism(bash){{{
# utf-8 でひらがな全部
$ echo -e "\u30"{4..9}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}
぀ ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゕ ゖ ゗ ゘ ゙ ゚ ゛ ゜ ゝ ゞ ゟ

# 2回変換して元に戻るかチェック
$ diff -u \
<(echo -e "\u30"{4..9}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}| xargs -n1) \
<(echo -e "\u30"{4..9}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} | nkf -r | nkf -r | xargs -n1)

(出力無し)
}}}

割愛しますが、カタカナも元に戻りました

nkfのソースだとこの辺あたりのようです

#prism(bash){{{
$ git clone https://scm.osdn.net/gitroot/nkf/nkf.git
$ cd nkf/
$ grep -rinw rot13
(略)
nkf.c:4156:#define rot13(c)  ( \
nkf.c:4177:     c1 = rot13(c1);
(略)
}}}

nkf.c

#prism(c){{{
4156 #define rot13(c)  ( \
4157                    ( c < 'A') ? c: \
4158                    (c <= 'M')  ? (c + 13): \
4159                    (c <= 'Z')  ? (c - 13): \
4160                    (c < 'a')   ? (c): \
4161                    (c <= 'm')  ? (c + 13): \
4162                    (c <= 'z')  ? (c - 13): \
4163                    (c) \
4164                   )
4165
4166 #define  rot47(c) ( \
4167                    ( c < '!') ? c: \
4168                    ( c <= 'O') ? (c + 47) : \
4169                    ( c <= '~') ?  (c - 47) : \
4170                    c \
4171                   )
4172
4173 static void
4174 rot_conv(nkf_char c2, nkf_char c1)
4175 {
4176     if (c2 == 0 || c2 == JIS_X_0201_1976_K || c2 == ISO_8859_1) {
4177         c1 = rot13(c1);
4178     } else if (c2) {
4179         c1 = rot47(c1);
4180         c2 = rot47(c2);
4181     }
4182     (*o_rot_conv)(c2,c1);
4183 }
}}}

マルチバイト文字を考慮しているのかは・・・(分からず/たまたまうまく動いている、と信じよう)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS