←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

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

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


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

No.4452

暗号化プログラムのアルゴリズム
投稿者---すずき(2005/08/17 12:57:44)


初めまして、すずきと申します。
最近になってCプログラムの勉強を始めました。

このサイトにある「おしゃべり掲示板」入り口のような暗号化プログラムを
作ってみました。
とは言っても、10進数から62進数(0〜9・A〜Z・a〜z)へ変換しているだけ
なのですが・・・

私なりの手順で暗号化・復号化を行なっておりますが、もっとC言語の
能力を活かせるような効率の良いアルゴリズムがあったら
教えていただきたく、よろしくお願いします。



●以下は、10進数から62進数に変換するプログラムです。
 実行すると「おしゃべり掲示板」と同じパスワードを表示します。

#include <stdio.h>
#define N 127012

int main(void)
{
long ten = N;
int i;
int j = 0;
char roku[62];
char kekka[10];
char ch;

/* 62進数コードの設定 */
for(ch = '0'; ch<= '9'; ch++) roku[ch-48] = ch;
for(ch = 'A'; ch<= 'Z'; ch++) roku[ch-55] = ch;
for(ch = 'a'; ch<= 'z'; ch++) roku[ch-61] = ch;
roku[62] = '\0';

/* 10進数→62進数への変換 */
while (ten >= 1) {
i = ten % 62;
kekka[j] = roku[i];
ten = ten / 62;
j++;
}
kekka[j] = '\0';

/* 変換した結果の表示 */
printf("暗号化の結果は:[");
for(i = j - 1; i>=0; i--) printf("%c",kekka[i]);
printf("]です。\n");

return 0;
}



●以下は、62進数から10進数に変換するプログラムです。
 パスワード(62進数)を入力すると、復号した結果を表示します。

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

int main(void)
{
int i,j,k;
long kekka = 0;
char roku[62];
char ango[10];
char ch;
char *p;

/* 62進数コードの設定 */
for(ch = '0'; ch<= '9'; ch++) roku[ch-48] = ch;
for(ch = 'A'; ch<= 'Z'; ch++) roku[ch-55] = ch;
for(ch = 'a'; ch<= 'z'; ch++) roku[ch-61] = ch;
roku[62] = '\0';

/* 62進数データの入力 */
printf( "暗号を入力 " );
scanf( "%s", ango );
/* 入力したデータの長さ */
i=strlen(ango);

/* 62進数→10進数への変換 */
for(j = 1; j <= i; j++ ) {
p = strchr(roku, ango[i-j]);
k = p - roku;
kekka = kekka + k * pow(62, j - 1);
}

/* 変換した結果の表示 */
printf("復号化の結果:%d\n",kekka);

return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:暗号化プログラムのアルゴリズム 4453 すずき 2005/08/17 13:40:33
<子記事> Re:暗号化プログラムのアルゴリズム 4454 Dina 2005/08/17 14:08:50


No.4453

Re:暗号化プログラムのアルゴリズム
投稿者---すずき(2005/08/17 13:40:33)


すずきです。

字下げするのを忘れて投稿してしまいましたので、
再投稿いたします。
大変申し訳ありませんでした。


●以下は、10進数から62進数に変換するプログラムです。
 実行すると「おしゃべり掲示板」と同じパスワードを表示します。

/*
#include <stdio.h>
#define N 127012

int main(void)
{
    long ten = N;
    int i;
    int j = 0;
    char roku[62];
    char kekka[10];
    char ch;

/*  62進数コードの設定    */
    for(ch = '0'; ch<= '9'; ch++) roku[ch-48] = ch;
    for(ch = 'A'; ch<= 'Z'; ch++) roku[ch-55] = ch;
    for(ch = 'a'; ch<= 'z'; ch++) roku[ch-61] = ch;
    roku[62] = '\0';

/*  10進数→62進数への変換 */
    while (ten >= 1) {
        i = ten % 62;
        kekka[j] = roku[i];
        ten = ten / 62;
        j++;
    }
    kekka[j] = '\0';

/*  変換した結果の表示 */
    printf("暗号化の結果は:[");
    for(i = j - 1; i>=0; i--) printf("%c",kekka[i]);
    printf("]です。\n");

    return 0;
}
*/

#include <stdio.h>

int main( void )
{
    int a[10] = {1, 2, 3}, i;   // Comment
    int *p = a; /* Pointer */
    
    for (i = 0; i < 10; i++) {
        printf( "%p : %d\n", &p[i], p[i] );
    }
    
    return 0;
}




●以下は、62進数から10進数に変換するプログラムです。
 パスワード(62進数)を入力すると、復号した結果を表示します。

/*
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
    int i,j,k;
    long kekka = 0;
    char roku[62];
    char ango[10];
    char ch;
    char *p;

    for(ch = '0'; ch<= '9'; ch++) roku[ch-48] = ch;
    for(ch = 'A'; ch<= 'Z'; ch++) roku[ch-55] = ch;
    for(ch = 'a'; ch<= 'z'; ch++) roku[ch-61] = ch;
    roku[62] = '\0';

    printf( "暗号を入力 " );
    scanf( "%s", ango );
    i=strlen(ango);

    for(j = 1; j <= i; j++ ) {
        p = strchr(roku, ango[i-j]);
        k = p - roku;
        kekka = kekka + k * pow(62, j - 1);
    }

    printf("復号化の結果:%d\n",kekka);

    return 0;
}
*/

#include <stdio.h>

int main( void )
{
    int a[10] = {1, 2, 3}, i;   // Comment
    int *p = a; /* Pointer */
    
    for (i = 0; i < 10; i++) {
        printf( "%p : %d\n", &p[i], p[i] );
    }
    
    return 0;
}




この投稿にコメントする

削除パスワード

No.4458

Re:暗号化プログラムのアルゴリズム
投稿者---かずま(2005/08/19 08:44:46)


> 字下げするのを忘れて投稿してしまいましたので、
> 再投稿いたします。

再投稿されたものはコンパイルできません。
コメントの範囲は? main() が2つ?


> 私なりの手順で暗号化・復号化を行なっておりますが、もっとC言語の
> 能力を活かせるような効率の良いアルゴリズムがあったら
> 教えていただきたく、よろしくお願いします。

strchr や pow を使うのは効率がよくありません。
#include <stdio.h>

char d[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char c[256];

void init(void)
{
    int i;
    for (i = 0; i < 62; i++) c[d[i]] = i;
}

void encode(unsigned long v, char *s)
{
    char t[8], *p = t;
    do *p++ = v % 62; while (v /= 62);
    do *s++ = d[*--p]; while (p != t);
    *s = '\0';
}

unsigned long decode(const char *s)
{
    unsigned char *p = (unsigned char *)s;
    unsigned long v = 0;
    while (*p) v = v * 62 + c[*p++];
    return v;
}

int main(void)
{
    unsigned long x, y;  char buf[8];

    init();
    while (scanf("%lu", &x) == 1) {
    	encode(x, buf);
    	y = decode(buf);
    	printf("%lu -> [%s] -> %lu\n", x, buf, y);
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.4470

Re:暗号化プログラムのアルゴリズム
投稿者---すずき(2005/08/20 15:39:32)


回答いただきまして、ありがとうございます。

>再投稿されたものはコンパイルできません。
>コメントの範囲は? main() が2つ?

HTML変換ツールの内容を、全てコピーして貼り付けてしまいました。
誤解を招くような事をしてしまい、大変申し訳ありません。

>strchr や pow を使うのは効率がよくありません。

strchr や pow では、どのように効率が悪くなるのか、
よろしければ教えていただけませんか?


エンコードとデコードを、ユーザ関数で分けてるんですね。
まだ、ポインタがしっかり理解できていないので、
アルゴリズムが解読しきれてないのですが、せっかく
教えていただいたので、勉強してひとつひとつ
理解していきたいと思います。

どうもありがとうございました。



この投稿にコメントする

削除パスワード

No.4480

Re:暗号化プログラムのアルゴリズム
投稿者---かずま(2005/08/21 14:05:46)


> strchr や pow では、どのように効率が悪くなるのか、
> よろしければ教えていただけませんか?

strchr(roku, ango[i-j]) が何をやっているのかを考えれば分かるはずです。

ango が "X2a" だったとき、ango[2] は 'a' なので、
strchr(roku, ango[i-j]) はこんなことをします。

 'a' は roku[0] の '0' と等しいか? 違う。
 'a' は roku[1] の '1' と等しいか? 違う。
 'a' は roku[2] の '2' と等しいか? 違う。
   :
 'a' は roku[35] の 'Z' と等しいか? 違う。
 'a' は roku[36] の 'a' と等しいか? そうだ。roku[36] のアドレスを返す。

効率悪いと思いませんか?

ango が "X2a" だったとき、k の値は、'X', '2', 'a' に対応して 33, 2, 36
となります。
kekka は、33*62*62 + 2*62 + 36 = 127012 ですが、
これを 33 * pow(62, 2) + 2 * pow(62, 1) + 36 * pow(62, 0) で計算すると
double pow(double, double) なので、
 pow(62, i-j) で int の i-j を double に変換する処理が実行される。
 pow の呼び出しが実行される。
 pow の中では、浮動小数点演算が実行される。
 pow は double を返すので、それを int に変換する処理が実行される。

効率悪いと思いませんか?

kekka = (33 * 62 + 2) * 62 + 36 で計算したほうがよいでしょう。


> まだ、ポインタがしっかり理解できていないので、
> アルゴリズムが解読しきれてないのですが、せっかく
> 教えていただいたので、勉強してひとつひとつ
> 理解していきたいと思います。

では、配列を使ったように見えるプログラムに書き換えたら理解できますか?
void encode(unsigned long v, char s[])
{
    char t[8];  int i = 0, j = 0;

    do t[i++] = v % 62; while ((v /= 62) != 0);
    do s[j++] = d[t[--i]]; while (i != 0);
    s[j] = '\0';
}

unsigned long decode(const char s[])
{
    unsigned long v = 0;  int i = 0;

    while (s[i]) v = v * 62 + c[s[i++]];
    return v;
}



この投稿にコメントする

削除パスワード

No.4495

Re:暗号化プログラムのアルゴリズム
投稿者---すずき(2005/08/22 14:26:24)


>strchr(roku, ango[i-j]) が何をやっているのかを考えれば分かるはずです。
>
>

>>double pow(double, double) なので、
> pow(62, i-j) で int の i-j を double に変換する処理が実行される。
> pow の呼び出しが実行される。
> pow の中では、浮動小数点演算が実行される。
> pow は double を返すので、それを int に変換する処理が実行される。
>
>効率悪いと思いませんか?

なるほど!
分かりやすい説明を、ありがとうございます。
strchr・powそれぞれの関数の処理方法と手順を知らなくてはいけませね。
非常に勉強になります。

>では、配列を使ったように見えるプログラムに書き換えたら理解できますか?

こちらのプログラムは分かり易いですね。
私にも理解する事ができました。
どうもありがとうございました。



この投稿にコメントする

削除パスワード

No.4454

Re:暗号化プログラムのアルゴリズム
投稿者---Dina(2005/08/17 14:08:50)


>もっとC言語の能力を活かせるような効率の良いアルゴリズム

どのようなアルゴリズムか良くわかりませんが、
世の中に、どのようなものがあるのか調べるのも
良いかもしれませんね。

http://www.maitou.gr.jp/rsa/
には、暗号について詳しく書いてあります。

また、暗号・複合のSourceCodeが公開されているものを
利用してみるのも良いかもしれませんね。
http://www.schneier.com/blowfish.html

ではでは。


この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity