1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5724

暗号、複合化
投稿者---松丸(2006/05/15 22:05:38)


暗号化の場合
% kadai e publickey(=公開鍵のファイル) original(=元のファイル) result(=暗号化されたファイル)
復号化の場合
% kadai d secretkey(=秘密鍵のファイル) encrypte(暗号化されたファイル) result(複号化されたファイル)
という風に実行する。

あらかじめ公開鍵{377,11}、秘密鍵{377,23}ファイルを用意しておき、
プログラム実行時に,暗号化か復号化かどちらをするのか判定して,必要な鍵を読みこむ。
(プログラムの中には書き込まない).
暗号化なら、文字コードに直し、その整数を暗号化して、ファイルに書き込む。
復号化なら、ファイルから読み込んだ整数を復号化し、そのコードの文字を書き込む。

ReadOneWordとpower_modをswitchのcase'e',case'd'に入れるのだと思ったのですが、うまくいきませんでした。
どのように組み込めばよいのでしょうか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ON 1
#define OFF 0
#define MAXWORDLEN 32 
#define REQUIRED_ARGS_NUMBER 5

enum ed {encrypt, decrypt} ;
enum ed interpret_args(int, char **) ;

char *KeyFileName, *InFileName, *OutFileName ;

void printusage()
{
        fprintf( stderr,"usage: prog2_3 e Publickeyfile Originalfile Encryptedfile \n") ;
        fprintf( stderr,"OR \n") ;
        fprintf( stderr,"usage: prog2_3 d Secretekeyfile Encryptedfile Decryptedfile \n") ;
        exit(-1) ;
}

enum ed interpret_args(int argc, char **argv)
{

char c;
enum ed mode ;

        switch(**argv) {
                case 'e':
                        fprintf(stderr,"\t Encrypt mode : ") ;
                        mode = encrypt ;
                        break;
                case 'd':
                        fprintf(stderr,"\t Decrypt mode : " ) ;
                        mode = decrypt ;
                        break;
                default :
                        fprintf(stderr,"Unknown process type: %s\n", *argv);
                        printusage();
        }

        argv++ ;
        strcpy(KeyFileName = calloc(strlen(*argv), sizeof(*argv)), *argv++);
        strcpy(InFileName = calloc(strlen(*argv), sizeof(*argv)), *argv++);
        strcpy(OutFileName = calloc(strlen(*argv), sizeof(*argv)), *argv);

        fprintf(stderr, "KeyfileName: %s ::: %s -> %s \n", KeyFileName, InFileName, OutFileName) ;
        return (mode) ;

}

int ReadOneWord( FILE *Infile, char *word ) 
{
    char c ;
    char StoreFlg ;  
        char *wp;
    int i ;

    i = 0 ;
    StoreFlg = OFF ;
    while( (c = getc(Infile)) != EOF ) {
        //if ( isalpha(c) || isdigit(c) ) {
                printf("%d,", c); 
        if ( !isspace(c) ) {
            StoreFlg = ON ; 
            word[i++] = c ; 
            if ( i >= MAXWORDLEN ) return 0 ;
        }
        else if ( StoreFlg ) {
            word[i++] = '\0' ; 
            return i ;
        }
    }
    return EOF ;
}

int power_mod( int base, int n, int m) 
{

    int h, hans ;


    if( n == 0 ) return (1) ;

    if( n%2 == 0 ) {
        h = n / 2;
                hans = power_mod(base,h,m);
        return ( (hans * hans ) % m ) ;
    }

    else {
        h = n / 2;
                hans = power_mod(base,h,m);
        return ( (base * hans * hans) % m) ;
    }
}

main(int argc, char **argv)
{
enum ed mode ; 

        if ( argc != REQUIRED_ARGS_NUMBER ) {
                printusage() ;
        }
        mode = interpret_args(argc, argv+1) ;
}






この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:暗号、複合化 5725 松丸 2006/05/15 22:55:36


No.5725

Re:暗号、複合化
投稿者---松丸(2006/05/15 22:55:36)


環境書き忘れてました。
OS : WindowsXP
コンパイラ : Borland C++です。

暗号化の場合、例えば
This is a pen.と入力したらその英文の文字コードと単語数84,104,105,115,32,105,115,32,97,32,112,101,110,46,4
を暗号化するといった手順です。


この投稿にコメントする

削除パスワード

No.5726

Re:暗号、複合化
投稿者---RAPT(2006/05/16 04:13:40)


# じっくりと読んではいませんが・・・
## 「暗号化、復号」ですよね。

> うまくいきませんでした
「何がどう」うまくいかないのでしょうか。
具体的にどのようなデータを与え、それがどうなると予測され、
結果どうなったか。まずはそれを書いてください。

その上で、デバッグした結果、どこ/何が疑わしいか、その根拠も含めて
書いてみてください。


この投稿にコメントする

削除パスワード

No.5732

Re:暗号、複合化
投稿者---松丸(2006/05/17 08:38:52)


>「何がどう」うまくいかないのでしょうか。
元のファイルにThis is a pen.と書き、公開鍵に377 11を書き実行して
その文字コードがpower_modで暗合されたものがresultに出力されることに
なりますが、char c; int p,q;としたとき
        switch(**argv) {
                case 'e':
                        c = ReadOneWord() ;
                        printf("%d,", c); 
                        power_mod(c,p,q);
                        fprintf(stderr,"\t Encrypt mode : ") ;
                        mode = encrypt ;
                        break;


として実行してみると実行時エラーが出てきて、デバッグ、エラー報告を送信する、送信しないの3択が出てきます。
ReadOneWordのif文を除き、power_modをいれずに実行するとものすごい量の文字コードのようなものが出てきました。


この投稿にコメントする

削除パスワード

No.5775

Re:暗号、複合化
投稿者---RAPT(2006/05/29 03:40:08)


はっきり言って、レスのつけようが無いです。
折角ソースを掲載するなら、コンパイル可能で意味のあるコードを掲載してください。

p,q って何?
ReadOneWord() の引数は?
KeyFileってどう扱ってるの?

こんなんじゃ、誰も答えられない。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ