gpgでの複数鍵指定 (turukame.1:09628| RENo.00474
taku さん 03/11/28 10:56
 

Iranoanさん、こんにちは。 takuです。

turukame.1からの引越しです。

> ある程度の雛形は直に浮かぶのですが、送信先が複数ある場合、どの様に暗
>号化すればよいのか解らず、結局作っていません(^^;。

gpgでの複数鍵指定は、こんな感じで良いみたいです。

gpg -e -r xxxx@aaa.xxx.jp -r xxxx@bbb.xxx.jp -o file.gpg file


[ ]
RE:00474 gpgでの複数鍵指定 (turukame.1:No.00475
Iranoan さん 03/11/28 18:23
 
 taku さん今日は、Iranoan です。
> gpgでの複数鍵指定は、こんな感じで良いみたいです。
>
> gpg -e -r xxxx@aaa.xxx.jp -r xxxx@bbb.xxx.jp -o file.gpg file
 情報有り難うございます。
 単純にアドレスに対して一つ一つ r オプションを指定すればよいんですね。

[ ]
RE:00475 GPG で添付ファイルを暗号化No.00476
Iranoan さん 03/11/28 18:38
 
 taku さん皆さん今日は、Iranoan です。
> > gpg -e -r xxxx@aaa.xxx.jp -r xxxx@bbb.xxx.jp -o file.gpg file
>  情報有り難うございます。
>  単純にアドレスに対して一つ一つ r オプションを指定すればよいんですね。
 一つ重大なことを忘れていました。
 コマンド・ラインが長くなってその制限を超えたときはどうしましょう?

[ ]
RE:00476 GPG で添付ファイルを暗号化No.00478
taku さん 03/11/28 19:24
 
>> > gpg -e -r xxxx@aaa.xxx.jp -r xxxx@bbb.xxx.jp -o file.gpg file
>>  情報有り難うございます。
>>  単純にアドレスに対して一つ一つ r オプションを指定すればよいんですね。
> 一つ重大なことを忘れていました。
> コマンド・ラインが長くなってその制限を超えたときはどうしましょう?

これは、鶴亀本体のメニューからの暗号化でも同様の制限となるの
ではないでしょうか?
gpgをコマンドとして使う限りしかたがないことだと思いますが…

[ ]
RE:00478 GPG で添付ファイルを暗号化No.00481
Iranoan さん 03/11/28 23:42
 
 taku さん今日は、Iranoan です。
> これは、鶴亀本体のメニューからの暗号化でも同様の制限となるの
> ではないでしょうか?
 鶴亀の場合は API も絡んできそうな気がします。取り敢えずマクロでは、
256 文字で制限をつけるしかなさそうですね。

[ ]
RE:00481 GPG で添付ファイルを暗号化No.00484
Iranoan さん 03/12/02 15:03
 
 今日は、Iranoan です。
> 取り敢えずマクロでは、
> 256 文字で制限をつけるしかなさそうですね。
 95 系は 128 文字のようなので、それを制限とすることにしました。公開に
必要なドキュメントを書く時間がちょっと取れないので、取り敢えずこちらに
投稿しておきますので、可笑しな部分をご指摘頂ければ幸いです。
//GPG/PGP で暗号化
//対象は、
//    鶴亀では、添付ファイル
//    秀丸では編集中のファイル (こちらは GPG だけ対応+暗号化後の
//              ファイルは、既にあっても上書き+標準の秘密鍵使用)
openreg "CURRENTUSER","Software\\Hidemaruo\\TuruKame\\Config";
if(result){
  loaddll getregstr("TuruKameDir") + "tkinfo.dll";
  if( dllfunc( "IsTuruKame" ) )goto TuruKame;
  else goto Hidemaru;
}
else goto Hidemaru;

TuruKame:
  if( getregnum("PgpProg")&1 )$$pgp = "gpg";
  else $$pgp = "pgp";
  closereg;
  call CheckType;
  call GetAddress;
  $$adr = $$return;
  ##xattach = dllfunc( "CountCurrentHeader", "X-Attach" ) - 1;
  $$home = dllfuncstr( "HomeDir" );
  $$folder = $$home + dllfuncstr( "CurrentAccount" ) + "\\";
  ##main = hidemaruhandle( 0 );
  //PGP の error を書き出すためのウィンドウを用意
  if( !dllfunc( "NewMail" ) )goto Error;
  showwindow 0;
  moveto 0, 0;
  gofileend;
  delete;
  beginsel;
  //ここの添付ファイルの暗号化
  while( ##xattach >= 0 ){
    $$attach = dllfuncstr( "ExecAt", ##main, "CurrentHeader2",
    "X-Attach", ##xattach );
    if( existfile( $$folder + $$attach ) ){
      call Basename $$attach;
      if( $$return != "pgp_signature" && $$return != "pgp_encrypted"){
      //PGP 暗号、書名は除外、「そのまま転送」は暗号化してもよいのか?
        if( !dllfunc( "Bypass_CopyFile", $$folder + $$attach, $$home +
         $$return, false) )goto Error;
        //コマンドラインを短くするために、一旦「ホームディレクトリ」にコピー
        $$cmdline = $$pgp + ".exe -e --yes" + $$adr + " -o \"" +
        $$return + "." + $$pgp + "\" \"" + $$return + "\"";
        if( strlen( $$cmdline ) < 128 ){
          setclipboard $$cmdline;
          run $$cmdline + " > con";//PGP の error を書き出す
          beginsel;
          if( !dllfunc( "ExecAt", ##main, "AddAttach", $$home +
           $$return + "." + $$pgp ) )goto Error;
          if( !dllfunc( "ExecAt", ##main, "UndoAttach", $$attach ) )
          goto Error;
          //一時ファイルの削除
          if( !dllfunc( "Bypass_DeleteFile", $$home + $$return + "." +
           $$pgp ) )goto Error;
          if( !dllfunc( "Bypass_DeleteFile", $$home + $$return ) )
          goto Error;
        }
        else message "ファイル名が長すぎます";
      }
    }
    ##xattach = ##xattach - 1;
  }
  if( linecount2 == 1 ){
  //PGP の error が無かったので結果ウィンドウは閉じる
    ##sub = hidemaruhandle( 0 );
    setactivehidemaru ##main;
    closehidemaruforced ##sub;
  }
  else{
    endsel;
    clearupdated;
    showwindow 1;
  }
End:
  freedll;
  endmacro;
Error:
  message "DLL 関数失敗";
  goto End;

CheckType://mail type 等の確認
  if( dllfunc( "IsTuruKameMain" ) )goto End;
  ##type = dllfunc( "MailType" );
  if( ##type == 3 || ##type == 4 )
  goto End;//送信済みを終了して良いか微妙
  if( dllfunc( "CountCurrentHeader", "Bcc" ) ){
    message "Bcc ヘッダが存在します";
    goto End;
  }
  return;

GetAddress://email address の取得
  ##i = dllfunc( "CountCurrentHeader", "From" ) - 1;
  while( ##i >= 0 ){
    $$header = $$header + ", " +
    dllfuncstr( "CurrentHeader2", "From", ##i );
    ##i = ##i - 1;
  }
  ##i = dllfunc( "CountCurrentHeader", "To" ) - 1;
  while( ##i >= 0 ){
    $$header = $$header + ", " +
    dllfuncstr( "CurrentHeader2", "To", ##i );
    ##i = ##i - 1;
  }
  ##i = dllfunc( "CountCurrentHeader", "Cc" ) - 1;
  while( ##i >= 0 ){
    $$header = $$header + ", " +
    dllfuncstr( "CurrentHeader2", "Cc", ##i );
    ##i = ##i - 1;
  }
  $$header = rightstr( $$header, strlen( $$header ) - 1 );
  ##i = dllfunc( "CountEmailList", $$header ) - 1;
  while( ##i >= 0 ){
    $$adr = $$adr + " -r " + dllfuncstr( "SetEmailOnly",
    dllfuncstr( "GetEmailList", $$header, ##i ));
    ##i = ##i - 1;
  }
  if( strlen( $$adr ) >= 128 ){
    message "送信先が多すぎます";
    goto End;
  }
  return $$adr;

Basename://ファイル名だけを取り出し
  call strstr2 $$1, "\\";
  return rightstr( $$1, strlen( $$1 ) - ##return - 1 );

strstr2:// 文字列の後方から文字列を検索するサブルーチン
  ##RC = -1;
  ##Size = strlen($$2);
  while( 1 ){
    ##Pos = strstr( $$1, $$2 );
    if( ##Pos == -1 )break;
    ##RC = ##RC + ##Pos + ##Size;
    $$1 = rightstr( $$1, strlen( $$1 ) - ##Pos - ##Size );
  }
  return ##RC;

Hidemaru:
  freedll;
  if(updated || filename == ""){
    save;
    if(!result){
      message "未保存ファイルの暗号化は出来ません";
      endmacro;
    }
  }
  openreg "CURRENTUSER", "Software\\GNU\\GnuPG";
  if(result){
    $$path = getregstr("HomeDir") + "\\";
    closereg;
  }
  else $$path = "C:\\gnupg\\";
  run $$path + "gpg.exe --yes -e --default-recipient-self -o " + "\""
  + basename +".gpg\" \"" + basename + "\"";
  endmacro;

[ ]
RE:00484 GPG で添付ファイルを暗号化No.00485
taku さん 03/12/02 20:25
 

>必要なドキュメントを書く時間がちょっと取れないので、取り敢えずこちらに
>投稿しておきますので、可笑しな部分をご指摘頂ければ幸いです。

こんなログが出力されるのですがOKなんでしょうか?
暗号化は正しく行われているようです。

gpg: xxx@xxx.xxx.co.jp: skipped: public key already present

一度だけ、マクロ実行時に鶴亀が落ちる現象が発生しました。
dump.txtが出力されているようなので、
マクロの影響かもしれませんが、こちらはturukame.1の
ほうに連絡しておきます。

あと、要望なんですが、鶴亀のメール本文の暗号化時のように、
暗号する場合のキー(メールアドレス)指定ができれば、
うれしいです。

P.S.
今回は、暗号化のマクロだけですが、復号マクロも作成予定
でしょうか?

[ ]
RE:00485 GPG で添付ファイルを暗号化No.00487
Iranoan さん 03/12/03 00:15
 
 taku さん今日は、Iranoan です。
> こんなログが出力されるのですがOKなんでしょうか?
> 暗号化は正しく行われているようです。
>
> gpg: xxx@xxx.xxx.co.jp: skipped: public key already present
 ... これは GPG が出すログなので、正直解らなければ、GPG のマニュアル
を見て欲しい。私も複数のアドレスによる暗号化すら解らなかった程なので(^^;。

 さて愚痴はこれぐらいにして本題です。結論としては問題ありません。PGP/
GPG は一組の鍵に対して複数のアドレスを関連付けられます。これは複数のア
ドレスを持っていても、使用者が同じなら鍵は一組の方が管理がしやすいから
でしょう。ですから、xxxxxxxx@hoge.hoge, xxxxxxxx@hoge.hoge,
xxxxxxxx@hoge.hoge で暗号化を試みた場合、同じ公開鍵を持つアドレスがあ
れば、そのアドレスの公開鍵では既に暗号化の指定がされているので、省略す
るということになります。

> あと、要望なんですが、鶴亀のメール本文の暗号化時のように、
> 暗号する場合のキー(メールアドレス)指定ができれば、
> うれしいです。
 まず「信頼できる人」のエディット・ボックスに当たる物ぐらいなら簡単に
できます。
 しかし「送り主も含める」のチェック・ボックスとなると、外部 DLL を使
う必要がでてきます。DLL については田楽 DLL を使うと、その導入で敷居が
更に高くなります。別途それ用の DLL を造る手も有りますが、これはちょっ
と面倒+そもそも自分のアドレスで暗号化しないことのメリットは、コマンド
ラインが短くなるぐらいしか思いつかない。あとマクロの question 関数を使
う手もありますが、これは毎回 1 アクション増えるので、私自身が操作する
のが面倒になるので、やりたく有りません。そんなわけで、取り敢えずこちら
については、無しということで。
 個人的には、前者についても、送信アドレスから複合できるアドレスを増減
させる状況というのが、今一つ想像できません。

> 今回は、暗号化のマクロだけですが、復号マクロも作成予定
> でしょうか?
 これは有りません。
 何故なら、まず暗号化されたファイルが一つだけなら、マクロにする必要性
を感じません。理由は、どちらにしてもパスフレーズを入力する必要は有るか
らです。
 次に「暗号化された添付ファイルが沢山ある」という状況は、私は想像でき
ません。理由は、それをやるぐらいなら、普通は最初に圧縮で一つに纏めて、
それを暗号化する、と思うからです。
 どんな時に、マクロになっていると便利なのでしょう?

[ ]
RE:00487 GPG で添付ファイルを暗号化No.00488
taku さん 03/12/11 19:43
 

忙しくて、返事を書きそびれていました。

>> こんなログが出力されるのですがOKなんでしょうか?
>> 暗号化は正しく行われているようです。
>>
>> gpg: xxx@xxx.xxx.co.jp: skipped: public key already present
> ... これは GPG が出すログなので、正直解らなければ、GPG のマニュアル
>を見て欲しい。私も複数のアドレスによる暗号化すら解らなかった程なので(^^;。
>

ごめんなさい、gpgが出力している、ログだったんですね。
マクロが出しているものだと思っていました。

>
>> あと、要望なんですが、鶴亀のメール本文の暗号化時のように、
>> 暗号する場合のキー(メールアドレス)指定ができれば、
>> うれしいです。
(省略)
>のが面倒になるので、やりたく有りません。そんなわけで、取り敢えずこちら
>については、無しということで。
> 個人的には、前者についても、送信アドレスから複合できるアドレスを増減
>させる状況というのが、今一つ想像できません。
>

「送信者を含める/含めない」件については、
メーリングリストなどに送付する場合に、本人は含めなくても
良い場合があります。
(こちらについては私もそれほど必要とは感じていませんが…、
 暗号に不要なキーが入ってしまいます)

「送信アドレスについては」件については、
相手先のメールアドレスが変更されたが、以前のキーをそのまま
使用している場合など、送信先は新アドレスで暗号キーは
旧アドレスを使用しないといけない場合があります。


>> 今回は、暗号化のマクロだけですが、復号マクロも作成予定
>> でしょうか?
> これは有りません。
(省略)
> 次に「暗号化された添付ファイルが沢山ある」という状況は、私は想像でき
>ません。理由は、それをやるぐらいなら、普通は最初に圧縮で一つに纏めて、
>それを暗号化する、と思うからです。

こちらでは、暗号化されたファイルが複数添付されている
場合がよくあります。

> どんな時に、マクロになっていると便利なのでしょう?

一つだけ添付されている場合でも、復号されて添付ファイルが
置き換われば、色々と(復号して、メールを編集可能にして、
再添付し直す)手間が省けるかなと思います。

[ ]
RE:00488 GPG で添付ファイルを暗号化No.00489
Iranoan さん 03/12/12 00:02
 
 taku さん今日は、Iranoan です。
> 相手先のメールアドレスが変更されたが、以前のキーをそのまま
> 使用している場合など、送信先は新アドレスで暗号キーは
> 旧アドレスを使用しないといけない場合があります。
 これはあり得ます。しかしこれは相手が自分の秘密鍵を新旧新アドレスに対
応させるのが、本筋だと思います。
 ##それとも私の認識が違うのか?
 私の認識が合っているなら、それをしないで、「使わなくなった古いアドレ
スで暗号化して」というのは変な話です。その変な対応をマクロにとり込むと
いうのは...。

> こちらでは、暗号化されたファイルが複数添付されている
> 場合がよくあります。
 有るんですね。一つ一つ暗号化するなんて、手間がかかるだろうに...。相
手の方はアーカイブというのをご存じ無いのかな〜。
 どちらにしてもこの複数の添付ファイルで一回のパスフレーズの入力で全部
複合という対応は、別途 DLL を作成しないといけないと思うので、取り敢え
ず止めておきます。

> 一つだけ添付されている場合でも、復号されて添付ファイルが
> 置き換われば
 添付ファイルが起き変わるというのが良く解りません。


[ ]
RE:00489 GPG で添付ファイルを暗号化No.00490
taku さん 03/12/12 11:49
 

> これはあり得ます。しかしこれは相手が自分の秘密鍵を新旧新アドレスに対
>応させるのが、本筋だと思います。
> ##それとも私の認識が違うのか?

それが正しいと思います、
でも気軽に私からは、新しい鍵を下さいとは言えない相手なので…

Iranoanさんのマクロを参考にちょっと、自分で考えてみたい
と思います。

> どちらにしてもこの複数の添付ファイルで一回のパスフレーズの入力で全部
>複合という対応は、別途 DLL を作成しないといけないと思うので、取り敢え
>ず止めておきます。
>

検討有難うございました。
こちらは、自分で作ったマクロでどうにかなりそうです。

>> 一つだけ添付されている場合でも、復号されて添付ファイルが
>> 置き換われば
> 添付ファイルが起き変わるというのが良く解りません。

送付されてきたメールに添付されている暗号ファイルが、
復号状態になる
(メール上で暗号ファイルが、元のファイルに置き換わる
 ということです)
この説明で、わかりますか?

[ ]
RE:00490 GPG で添付ファイルを暗号化No.00491
Iranoan さん 03/12/14 15:42
 
 taku さん今日は、Iranoan です。
> 送付されてきたメールに添付されている暗号ファイルが、
> 復号状態になる
> (メール上で暗号ファイルが、元のファイルに置き換わる
>  ということです)
 理解できました。
 ただこれは、便利なのは理解できるものの、いわばメールの改変になります。
また「そのまま転送」とかを間違えてやってしまうと、当然復号化された添付
メールを送ってしまいます。そんなわけで、このあたり簡単には結論出せません。
 また、今ませまさんのサイトの
みんなで秀丸マクロを作る掲示板 http://hpcgi2.nifty.com/masema/bbs2/wforum.cgi
にて、鶴亀でも使用できるスペル・チェッカのβテストを行っている最中です
ので、こちらについては一先ず保留にしておきます。

 ただ taku さんがマクロを変更する参考になればよいということで、個人的
に使用している参考になりそうなマクロをアップしておきます。
//受信メールに添付ファイルを追加
loaddll hidemarudir + "\\DengakuDLL.DLL";
$$files = dllfuncstr( "GETFILENAME", hidemaruhandle( 0 ), "添付ファイ
ルの選択", getenv( "HOME" ), "全て(*.*)" );

if( $$files == "" )goto End;
loaddll "tkinfo.dll";
if( !result )call Error "DLL 読み込み失敗";
##n = dllfunc( "MailType" );
if( ##n == -1 )call Error "メールが選択されていません";
else if( ##n != 3 && ##n != 4)call Error "送信メールでこのマクロを使う
必要がある?";
if( !dllfunc( "IsTuruKame" ) )call Error "鶴亀でしか意味がない";
if( !dllfunc( "IsTuruKameMain" ) )call Error "本体でしか実行できません。
\nただし改良は可能";
if( dllfunc( "IsTuruKameGrep" ) )call Error "本体でしか実行できません。
\nただし改良は可能";

$$path = dllfuncstr( "CurrentHeader", "X-Attach" );
$$home = dllfuncstr( "HomeDir" ) + dllfuncstr( "CurrentAccount") + "
\\";
if( $$path == "" ){
  $$day = "受信添付\\" + rightstr( year, 2 ) + month + rightstr( "0" +
  str( val(day) - 1 ), 2 ) + "_";
  ##i = 0xFF;
  while( ##i ){
    ##n = dllfunc("Bypass_GetFileAttributes", $$home + $$day + hex( ##i ) );
    if( ##n == 0xFFFFFFFF ){
      $$path = $$day + hex( ##i );
      break;
    }
    ##i = ##i - 1;
  }
  if( !##i )call Error "フォルダの作成失敗:000000";
  if( !dllfunc( "Bypass_CreateDirectory", $$home + $$path) )call Error
  "フォルダの作成失敗:0 " + $$path;
}
else{
  call strstr2 $$path, "\\";
  $$path = leftstr( $$path, ##return );
  ##n = dllfunc("Bypass_GetFileAttributes", $$home + $$path);
  if( ##n == 0xFFFFFFFF ) {
    if( !dllfunc( "Bypass_CreateDirectory", $$home + $$path) )call
    Error "フォルダの作成失敗:1 " + $$home + $$path;
  }
  else if( (##n & 0x10) == 0 )call Error "何故かファイルが存在します";
}

if( !dllfunc( "BeginEditMail" ) )call Error "編集許可に出来ませんでした";
##return = strstr( $$files, "|" );
$$path = $$path + "\\";
if( ##return == -1 ){
  call strstr2 $$files, "\\";
  $$file = rightstr( $$files, strlen( $$files ) - ##return - 1 );
  call Attach $$files, $$home + $$path, $$path, $$file;
}
else{
  $$dir = leftstr( $$files, ##return ) + "\\";
  $$files = rightstr( $$files, strlen( $$files ) - ##return - 1);
  ##return = strstr( $$files, "|" );
  while( ##return != -1 ){
    $$file = leftstr( $$files, ##return );
    $$files = rightstr( $$files, strlen( $$files ) - ##return - 1);
    ##return = strstr( $$files, "|" );
    call Attach $$dir + $$file, $$home + $$path, $$path, $$file;
  }
  //最後の 1 個
  call Attach $$dir + $$files, $$home + $$path, $$path, $$files;
}
if( !dllfunc( "SaveEditMail" ) )call Error "メールが保存できませんでした";
goto End;

strstr2:// 文字列の後方から文字列を検索するサブルーチン
  // (引数) $$1: 文字列、$$2: 検索文字列
  // (返り値) ##return: 見つかった位置(0オリジン)、-1:見つからなかった
  ##RC = -1;
  ##Size = strlen($$2);
  while( 1 ){
    ##Pos = strstr( $$1, $$2 );
    if( ##Pos == -1 )break;
    ##RC = ##RC + ##Pos + ##Size;
    $$1 = rightstr( $$1, strlen( $$1 ) - ##Pos - ##Size );
  }
  return ##RC;

Attach:
  if( existfile( $$1 ) ){
    if( !dllfunc( "Bypass_CopyFile", $$1, $$2 + $$4, false) )call
    Error "ファイルコピーに失敗";
    if( !dllfunc( "AddHeader", "X-Attach", $$3 + $$4) )call Error "
    ヘッダ追加失敗";
    //X-Attach ヘッダの確認必要
  }
  else message $$1 + "は存在しません";
  return;

Error:
  message $$1;
End:
  freedll;


[ ]
RE:00491 GPG で添付ファイルを暗号化No.00509
taku さん 04/01/08 18:29
 
Iranoanさん、ありがとうございます。

マクロ参考になりました。
取り合えず動くものができました。


[ ]