2015年4月10日金曜日

opensslで暗号化

# 公開鍵と秘密鍵を作成(セキュアな場所:自身のホームディレクトリとかでおこなう)

$ openssl req -x509 -nodes -newkey rsa:2048 -keyout private_key.pem -out pubkey.pem -subj '/'

ここで作成された秘密鍵(private_key.pem)は門外不出にすること(復号に必要)。
公開鍵は(pubkey.pem)ばらまいてよい(暗号に必要)


# 公開鍵で暗号化テスト(ファイルtest.binを暗号化してtest.bin.encを作る)

$ openssl smime -encrypt -aes256 -in test.bin -binary -outform DEM -out test.bin.enc pubkey.pem


# 復号(秘密鍵使用)テスト

$ openssl smime -decrypt -in test.bin.enc -binary -inform DEM -inkey private_key.pem -out test.bin



以上。

公開鍵暗号方式は共通鍵方式に比べ一般の人にはわかりづらいようですが、簡単な考え方として、公開鍵は南京錠そのもので、秘密鍵は南京錠を開く鍵と例えると解り易いかと思います。
即ち大事なものを鍵をかけて送ってもらうには南京錠を開いたまま相手に渡し、鍵をロックして送ってもらう。それを解けるのは自分だけとなります。

(追記)
と思ったら、巨大のファイルはやっぱりダメなので以下の構文で暗号/復号する方がいいかな。
鍵は別系統で渡せばよいし。

暗号(file.txtをfile.txt.encへ)
$ openssl enc -e -aes-256-cbc -in file.txt -out file.txt.enc -kfile passphrase.dat

復号(file.txt.encをout.txtへ)
$ openssl enc -d -aes-256-cbc -in file.txt.enc -out out.txt -kfile passphrase.dat

passphrase.dat は、256文字以上の適当な文字列(鍵)

SaffariからChromeを開く

というか、SaffariでみているページをChromeで開きなおすには、以下の行をブックマークのURLとする。

javascript:location.href="googlechrome"+location.href.substring(4);



ソースコード閲覧用HTML作成ツール global

は、便利だが、いつも使う前に調べる。

gtags -vw
htags -sanovw
で、OK

Unix(Linux) Tipsいろいろ

階層下の.git以外のCソースとヘッダ群


find . -name '.git' -prune -o -type f -name '*.c' -o -name '*.h'

※ここでは何故か最後に-printをつけると.hしか表示されず、.cのみ表示される
が、.gitが表示されてしまう。(唯一のディレクトリ)
最後のprintを除くと何故か.gitだけは表示される(その下の.git下のディレクトリ群は表示されないが)

find . -name '.git' -prune -o -type f \( -name '*.c' -o -name '*.h' \) -print
とするとうまくいった。

使用例:

#!/bin/bash

for file in `find . -name "*.c* *.h" -type f`
do
echo $file
expand -t8 ${file} > ${file}.$$ && mv -f ${file}.$$ ${file} || rm -f ${file}.$$
done


回数ループをシェルスクリプトで 


seq 1 9

for i in `seq 1 9`
do
  echo $i
done


階層下ファイルの一括置換

xargs sed -i 's/BEFOR_STRING/REPLACE_STRING/g'

これを応用し、
find . -name '.git' -prune -o -type f \( -name '*.c' -o -name '*.h' \) -print | xargs sed -i 's/\r$//'
として、改行コードをWinからUnixへ変える

gccでカバレッジ

gcc --coverage
オプション付けてコンパイルリンク

実行
(cutterでもよし)

$ lcov -c -d . -o xxx.info
$ genhtml xxx.info

以上
何回も実行すると累積されていく。

gcc: 定義済みマクロ

いつもいつも悩む
デフォルトでコンパイラ内に#defineされている、gccの 定義済みマクロ

gcc -E -dM -xc /dev/null

実行プログラムのFullPathを得る(Win32のGetModuleFilename())

Winや、Win32 APIではそのものズバリのAPIがあるが、Linuxで。

#include "stdio.h"
#include "unistd.h"
     int v = readlink("/proc/self/exe", s, sizeof(s));
      if (v != -1) {
          printf("FullPath=%s\n", s);
     }
 }

ファイルロック(排他)は、flock関数の他にシンボリックリンクファイルの作成で実現できる。
ロックファイルを作っておいて、それを指すシンボリックリンクが作成出来たら、成功、失敗したら失敗。

Unix一般にはどうなんだろう?/procファイルシステムがあればいけるかもだが、
最近、ほかのUnixに触る機会がないので不明