画像データの暗号化について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
新人

画像データの暗号化について

#1

投稿記事 by 新人 » 18年前

まだまだC言語を始めてからまもない新人です。
このサイトの講座には大変助けられています。

質問なのですが、現在ゲームを開発していて
ふと画像データを見られては嫌だな、と暗号化に手をつけようと思うのですが、
なかなかうまくいきません。
DXライブラリ本館のリファレンス「CreateGraphFromMem~」より
NOT演算(~)なるものをしてみようかとも思ったのですが、
NOT演算(~)を画像データに掛ける方法がわかりません。。

また、同様の方法でセーブデータなどの暗号化も可能でしょうか?

もしよろしければアドバイスなどいただけたら幸いです。

tk-xleader

Re:画像データの暗号化について

#2

投稿記事 by tk-xleader » 18年前

グラフィックを1バイトずつunsigned char型配列に収め、順番にNOT演算を掛けていくと
言うのはどうでしょうか。unsigned char型配列なのは、NOTを含むBit演算は符号なし整
数に適用するほうがいいからです。

Justy

Re:画像データの暗号化について

#3

投稿記事 by Justy » 18年前

NOT演算(~)を画像データに掛ける方法がわかりません

 NOT演算というのは値に対し "~"をつけることで内部のビットが反転(2進数で 0101なら 1010のように)させることです。
 当然、もう1度 ~を行うことで元の値に戻すことができます。

[color=#d0d0ff" face="monospace">
    //  初期化(0000 0111 0101 1011 1100 1101 0001 0101) 
    unsigned int v1 = 123456789;
    printf("org v1 = %u\n", v1);
    
    //  not化(1111 1000 1010 0100 0011 0010 1110 1010) 
    v1 = ~v1;
    printf("not v1 = %u\n", v1);
    
    //  元に戻す(0000 0111 0101 1011 1100 1101 0001 0101) 
    v1 = ~v1;
    printf("rvt v1 = %u\n", v1);
[/color]
 
 これを実行すると

[color=#d0d0ff" face="monospace] org v1 = 123456789
not v1 = 4171510506
rvt v1 = 123456789
[/color]

 と、notで反転したものが rvtで元に戻ります。
(orgはオリジナル、notはそのまま、rvtは notされた値を再度 notしたときの値です)


 これが NOT演算の基本ですが、これを画像データに適用するなら、以下のように行います。
[color=#d0d0ff" face="monospace]#include <stdio.h>
#include <stdlib.h>

//  ファイルから読み出し
void *read_file(const char *fileName, unsigned int *pSize)
{
    FILE *fp;
    unsigned char *buff;
    unsigned int size;
    
    if(!fileName)   return NULL;
    fp = fopen(fileName, "rb");
    
    if(!fp)         return NULL;
    fseek(fp, 0, SEEK_END);
    size = (size_t)ftell(fp);
    fseek(fp, 0, SEEK_SET);
    
    buff = (unsigned char *)malloc(size+1);
    if(buff)
    {
        fread((void*)buff, (size_t)size, 1, fp);
        buff[size] = 0;
        if(pSize)   *pSize = size;
    }
    
    fclose(fp);
    return buff;
}

//  ファイルに書き出し
void write_file(const char *fileName, void *buff, unsigned int buffSize)
{
    FILE *fp;
    
    if(!fileName)           return;
    if(!buff || !buffSize)  return;
    
    fp = fopen(fileName, "wb");
    if(fp)
    {
        fwrite(buff, (size_t)buffSize, 1, fp);
        fclose(fp);
    }
}

//  指定されたサイズ分 srcから NOT処理をして outに書き出す
void data_not(void *dest, const void *src, unsigned int size)
{
    unsigned char *uc8_dest = (unsigned char *)dest;
    const unsigned char *uc8_src = (const unsigned char *)src;
    while(size--)
        *uc8_dest++ = ~*uc8_src++;
}

int main()
{
    //  ファイル名
    static const char inFileName[/url] = "sample.bmp";
    static const char outFileName[/url] = "sample.bmp.not";
    
    //  ファイルを読む
    unsigned int fileSize;
    void *graphicsData = read_file(inFileName, &fileSize);
    
    if(graphicsData)
    {
        //  NOT処理をしてファイルに書き出す
        data_not(graphicsData, graphicsData, fileSize);
        write_file(outFileName, graphicsData, fileSize);
        
        free(graphicsData);
    }
    return 0;
}[/color]
 read_file()でファイルの内容を全て読みとり、data_not()で全データに対して NOT処理をかけています。
(ついでに write_file()で NOTしたデータをファイルに書き出しています)



同様の方法でセーブデータなどの暗号化も可能でしょうか
 可能です。
 ただ、NOTは非常に規則性を見破ることが容易なので、XOR演算やローテートなどを組み合わせた方がいいかと思います。

http://ja.wikipedia.org/wiki/%E3%83%93% ... 4%E7%AE%97

新人

Re:画像データの暗号化について

#4

投稿記事 by 新人 » 18年前

丁寧なご返答ありがとうございます。

上記のソースなのですが、コンパイル時にエラーがでてしまいます 汗
未熟者なので解決にみちびけず、どのようにすればいいでしょうか?

ちなみにMicrosoft Visual C++ 2005 Express Editionを利用しています。

Justy

Re:画像データの暗号化について

#5

投稿記事 by Justy » 18年前

 具体的にどういうエラーが出ますか?

新人

Re:画像データの暗号化について

#6

投稿記事 by 新人 » 18年前

1>c:\~\main.cpp(19) : error C2440: '=' : 'void *' から 'unsigned char *' に変換できません。
1> 'void*' から非 'void' 型への変換には明示的なキャストが必要です。

といったものです。

Justy

Re:画像データの暗号化について

#7

投稿記事 by Justy » 18年前

 あぁ、なるほど。
 失礼しました。C++でコンパイルしていましたか。

 その行を
buff = (unsigned char *)malloc(size+1);
 と書き換えみて下さい。


# 上のも修正しておきます。

新人

Re:画像データの暗号化について

#8

投稿記事 by 新人 » 18年前

ありがとうございます!
無事コンパイルが成功し、暗号化ファイルも生成できました。

質問ばかりで申し訳ないのですが、
もうひとつよろしいでしょうか?

暗号化されたセーブデータのロード時なのですが、
どのようにすればよいでしょうか?
できれば読み込む際にnotし、解読したいのですが・・・
現在のソースを提示しておきます。


FILE *fp ;
fp = fopen("暗号化されたファイル", "r") ;
if (fp == NULL)
{
printf("セーブデータを開けませんでした。\n");
return EXIT_FAILURE;
}
script_count = 0 ;


/* 読み込み */

while (fgets(Script[script_count], STR_MAX, fp) != NULL)

{
/* 最後の改行を削除 */
script_last = strlen(Script[script_count]) - 1;
if (Script[script_count][script_last] == '\n')
{
Script[script_count][script_last] = '\0';
}
script_count++;
}

fclose(fp) ;

新人

Re:画像データの暗号化について

#9

投稿記事 by 新人 » 18年前

上記にあげられていた暗号化プログラムを応用して解読が可能でしたね;
おかげで無事に問題を解決することができました。
質問に答えていただいたお二人、本当にありがとうございます。


以降余談ですが・・・
今回のことで少し暗号化というものについて興味がでてきました。
かねてから多少なり興味はあったものの
敷地があまりにたかそうだな・・・などとあきらめていたのですが、
簡単なレベルのものもあるのですね。
すこしづつ複雑なものをつかっていけるように
精進していきたいと思います。
<!--1

pipi

エラーの内容がどうしても分かりません。

#10

投稿記事 by pipi » 18年前

申し訳ありません、このサイトで勉強しております。初心者なので教えてください。
VC2005を使ってプログラミングをしております。
エラーは、以下のようになっております。
見づらいと思いますが、ご親切な方、よろしくお願いします。

c:\program files\microsoft platform sdk\include\mmreg.h : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\dxlib.h(1529) : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(6) : error C3872: '0x3000': この文字を識別子で使用することはできません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C2144: 構文エラー : 'int' は ';' によって先行されなければなりません。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C3872: '0x3000': この文字を識別子で使用することはできません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(7) : error C3872: '0x3000': この文字を識別子で使用することはできません

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(8) : error C2144: 構文エラー : 'int' は ';' によって先行されなければなりません。

c:\documents and settings\yu-ki-pippi\デスクトップ\dxlib_vc\サンプルプログラム実行用フォルダ\test.cpp(8) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

ブラウザ情報ファイルを作成しています...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
ビルドログは "file://c:\Documents and Settings\yu-ki-pippi\デスクトップ\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\BuildLog.htm" に保存されました。
DxLib - エラー 7、警告 2

GPGA

Re:エラーの内容がどうしても分かりません。

#11

投稿記事 by GPGA » 18年前

6行目と7行目に全角スペースが入っているからエラーが出ています。

pipi

ご回答ありがとうございました。

#12

投稿記事 by pipi » 18年前

>GPGAさん

素早いご回答ありがとうございました。

仰っられた通り、全角スペースが入っていたためでした。

大変助かりました^^。

また、質問をすると思いますので、その時はよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る