CまたはC++言語から利用できる暗号化ライブラリを探しています。
ソフトウェア内から、ファイルを暗号化・復号化できるものです。
できたらフリーのものがいいのですが、商用でもかまいません。
お勧めのライブラリ等がありましたら、ぜひ教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

どの辺り迄を以って強度が有るかを判定するのは各社(者)差が有るのでなんとも言えませんが、私が個人で書いた単純なアルゴリズムのエンコードは今のところ破られた報告を受けておりません。


(幾つかの市販パッケージにも導入しています。)

以下のURLにフリーツールを公開していますので、興味が有る様でしたらWebの問い合わせフォームからご連絡ください。
(配布ツールのドキュメントに記述されているメールアドレスはSPAM対策で現在無効になっています。)

参考URL:http://ninja.index.ne.jp/~toshi/others.htm
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
現在、WindowsAPIのcryptの使い方がほぼわかったので、その方向で進ん
でおります。
ご紹介ありがとうございました。

お礼日時:2001/05/11 14:39

どの程度のセキュリティが必要化にも寄るんじゃないでしょうか?


意外とNINJA104さんがおっしゃってるような、単純なアルゴリズムにちょっと一工夫するだけでいけるんじゃないかと思うんですけどね。

Vectorにもいくつかライブラリは有るようです。

参考URL:http://www.vector.co.jp/vpack/filearea/win/prog/ …
    • good
    • 0
この回答へのお礼

vectorでは独自のDESのアセンブラソースをみつけたのですが、他にも
まだあるかもしれませんね。ご回答ありがとうございます。

お礼日時:2001/05/09 21:07

特定のアプリケーション上でのみファイルの中見を展開するのが目的でしょうか?



だとしたら、単純にビットのシフトとローテート等を組み合わせ、専用にコーディングするのが簡単且つ早道で後々に版件問題も発生しにくいのでお勧めします。
    • good
    • 0
この回答へのお礼

ご指摘の通り特定のアプリケーションでのみ扱うファイルです。
ビットのシフト等のみでは暗号の強度が足りないのですが、それほど強力な強度
が必要なわけでもなさそうなので、コーディングの方向でも検討しております。
ご回答ありがとうございます。

お礼日時:2001/05/09 21:05

PGPと言うのがありますよ。


http://www05.u-page.so-net.ne.jp/ba2/naoki-s/pgp …
いかがでしょうか。

参考URL:http://www05.u-page.so-net.ne.jp/ba2/naoki-s/pgpi/
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
PGPは公開鍵を使うシステムですが、PGPではない、一般的な暗号化
ライブラリを探しています。
現在のところ、Windows環境にあるCryptAPIというのを見つけたので、検討
しています。他にもいいものがあればご教示頂ければ幸いです。

お礼日時:2001/05/09 13:05

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qファイルではなく文字列を暗号化するAPIありますか

「linuxで暗号化」などと検索すると、だいたいgnuPGとかがヒットするのですが、これらはファイル全体を暗号化/復号化するものですよね。
やりたいことは、ファイル全体を暗号化するのではなく、ファイル中の特定の場所に書かれている文字列のみを暗号化/復号化したいのですが、そのような用途で手軽に使えるAPIなどありましたら、教えて下さい。たとえば、個人情報の含まれる文書の個人情報部分だけを暗号化して、それをネットワーク上に流したりする感じです。
centos、redhatなどで使えたらうれしいです。
それほど頑強でなくていいんで、適当に作ってもいいんですが、時間がないので既存のAPIがあったらなーと。

Aベストアンサー

Linuxで使える暗号化、復号のためのC/C++のライブラリーの代表例はopenssl、libgcrypt、nssだと思います。Linuxに限らず、Javaでは暗号化は標準のライブラリーに含まれます。

たとえば、opensslで暗号化する方法はこのブログのような感じです。
http://blogs.itmedia.co.jp/komata/2011/02/caesopensslmcry.html
この例だとAESというブロック暗号を使っているので、16バイトごとに暗号化することになります。

libgcryptだとこんな感じです。
http://cboard.cprogramming.com/c-programming/105743-how-decrypt-encrypt-using-libgcrypt-arc4.html
こちらもAESで暗号化しています。

nssだとここからサンプルがリンクされています。
http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn5.html
この例だとAESではなくDESのCBCモードで暗号化しています。

ちなみに、各プログラミング言語ごとに代表的な暗号化・復号のライブラリーがあるので、「Python 暗号化」のようにプログラミング言語の名前と「暗号化」をキーワードにして検索してみると良いと思います。


ネットワーク上で個人情報をやり取りする場合は普通SSLを使うように思います。CやC++からSSLを使うにはopenssl、gnutls、nssが有名なライブラリーだと思います。こちらも各プログラミング言語ごごとに標準的なライブラリーというものがありますのでpython sslなどで検索してみると良いと思います。

Linuxで使える暗号化、復号のためのC/C++のライブラリーの代表例はopenssl、libgcrypt、nssだと思います。Linuxに限らず、Javaでは暗号化は標準のライブラリーに含まれます。

たとえば、opensslで暗号化する方法はこのブログのような感じです。
http://blogs.itmedia.co.jp/komata/2011/02/caesopensslmcry.html
この例だとAESというブロック暗号を使っているので、16バイトごとに暗号化することになります。

libgcryptだとこんな感じです。
http://cboard.cprogramming.com/c-programming/105743-how-decrypt-e...続きを読む

Q暗号化・復号化のアルゴリズムにはどんなものがありますか?

Cでプログラミングを勉強しており、20文字ほどの文字列を暗号化・復号化するプログラムを考えていますが、ネットを検索しても暗号化アルゴリズムでなかなかいいものが見つかりません。

私のリクエストとしては

・暗号化対象は半角英数字、半角記号のみ。
・単に文字コードを1つずつずらしたような簡単な暗号ではなく、複雑なアルゴリズムを使用したい。
・アルゴリズムは複雑でもプログラムは簡潔にできるものがいい。(長くても数百行程度)。
・アルゴリズム自体の仕様が公開されている。
・アルゴリズムは数学式で表せるものがいい。
・スーパーコンピュータを使わなければ解けないほど時間がかかる暗号化アルゴリズムでなくてもいい。
・暗号化のライブラリファイルは使わず、自前で全部コードを書きたい。
・公開鍵や秘密鍵を使わなくてもいい。

上記の条件を満たす暗号化アルゴリズムでいいものがありましたら、教えてください。

以上、よろしくお願いします。

Aベストアンサー

Blowfishはどうでしょうか。

・暗号化対象は半角英数字、半角記号のみ。
> バイナリデータでしたらなんでも暗号化できます。

・単に文字コードを1つずつずらしたような簡単な暗号ではなく、複雑なアルゴリズムを使用したい。
> 簡単に解く方法はまだ見つかっていないはずです。

・アルゴリズムは数学式で表せるものがいい。
> どのようなものを数学式として想定されているのかは分かりませんが、
> 数学式で表せない暗号化方式はコードにできないと思いますので
> 数学式でも表せるでしょう。

・暗号化のライブラリファイルは使わず、自前で全部コードを書きたい。
> サンプルコードを見ていただければ分かるのですが、600行ほどのコードで実現できます。自前で全部書けるでしょう。

> 公開鍵や秘密鍵を使わなくてもいい。
共通鍵暗号方式なので公開鍵や秘密鍵は使いません。

参考URL:http://www.schneier.com/blowfish-download.html

QVC++から引数付きexeファイルの実行

タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか?
exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。
出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。
開発環境はVisualStudio2005です。

Aベストアンサー

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
printf("ARGV[%d]=%s\n",i,argv[i]);
}
return 0;
}
以下、実行結果です。
コマンドプロンプト画面に下記の文字が出力されます。
------------------------
system試験開始
ARGV[0]=C:\VCSTUDY\printarg\Debug\printarg.exe
ARGV[1]=XXX
ARGV[2]=YYY
ARGV[3]=ZZZ
system成功
Press any key to continue
---------------------------

#1です。こちらで作成したサンプルです。
呼び出し側
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
intret;
printf("system試験開始\n");
ret = system("C:\\VCSTUDY\\printarg\\Debug\\printarg.exe XXX YYY ZZZ");
if (ret == 0){
printf("system成功\n");
}else{
printf("system失敗\n");
}
return 0;
}
----------------------

呼び出される側(c:\\test.exeに相当)
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
inti;
for (i = 0; i < argc; i++){
p...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QAES暗号化アルゴリズムの動作モードについて

AESのサンプルコードを見つけました。

http://free.pjc.co.jp/AES/index.html

ダウンロード
Aes 暗号プログラム(ソース一式)(2009/3/6版) ms vc6.0

というものがあるのですが、
このAESサンプルプログラムの「動作モード」がわかりません。

・ECBモード
・CBCモード
・CFBモード
・OFBモード
・他?

お詳しい方、ご教授いただけると幸いです。

Aベストアンサー

これらはブロック暗号を任意サイズのデータに適用するときにどのように処理するかを規定するものです。
・ECB(Electronic CodeBook)電子符号表モード
 単純にブロックごとに暗号化する。安全でなく使うべきでない。
・CBC(Cipher Block Chaining)暗号ブロック連鎖モード
 ブロックを前ブロックの暗号化結果と排他的論理和を取ってから暗号化する。最初のブロックは初期ベクタという乱数と排他的論理和を取る。
・CFB(Cipher Feed Back)暗号フィードバックモード
 前ブロックを暗号化してブロックとの排他的論理和をとって暗号文とする。最初のブロックは初期ベクタの暗号化との排他的論理和で暗号化する。
・OFB(Output Feed Back)出力フィードバックモード
 初期ベクタに繰り返し暗号化処理して乱数ストリームを作り、これと平文との排他的論理和を暗号文とする。
・CTR(Counter)カウンターモード
 各ブロックを初期値から1ずつ増加するカウンタの暗号化との排他的論理和で暗号化する。各ブロックを並列に処理できる。

ちょっと調べてみましたがネット上で得られる情報では間違っているものもあるようでした。
書籍としてはちょっと古いかもしれませんが「暗号技術入門 秘密の国のアリス」を薦めておきます。
# 新版が出ているようです
# http://www.amazon.co.jp/exec/obidos/ASIN/4797350997/

これらはブロック暗号を任意サイズのデータに適用するときにどのように処理するかを規定するものです。
・ECB(Electronic CodeBook)電子符号表モード
 単純にブロックごとに暗号化する。安全でなく使うべきでない。
・CBC(Cipher Block Chaining)暗号ブロック連鎖モード
 ブロックを前ブロックの暗号化結果と排他的論理和を取ってから暗号化する。最初のブロックは初期ベクタという乱数と排他的論理和を取る。
・CFB(Cipher Feed Back)暗号フィードバックモード
 前ブロックを暗号化してブロックとの排他...続きを読む

Q公開鍵暗号のソースコード

公開鍵暗号のソースコードで処理速度の速いもので、
公開されていて、使い勝手の良いものはありませんか?

メールソフト(PCとスマホ)やスマホの音声通信アプリで使いたいと思っています。
暗号については、それなりに勉強はしています。

よろしくお願いします。

Aベストアンサー

OpenSSLライブラリには、公開鍵暗号(RSAなど)の実装(かなり最適化されています)も何種類か入っているけど。
(SSLプロトコルじゃなくて、OpenSSLライブラリのことですよ。念のため。)

>AES,Serpent,MARS,Twofish,Misty,RSA,楕円曲線暗号
自分で再実装したんなら、それ使えばいいのでは?

結局のところ何を探しているのですか?

Qfopenで開いたファイルのサイズを取得したい

おはようございます。
Javaはそれなりに経験があるのですが、Cの経験は皆無に等しいものです。

FILE *fp;
fp = fopen("C:\hoge.txt","r");
if(::GetFileSize(fp,NULL)>1000000){
ログをバックアップに格納し、新しいファイルを作る;
}

としたところ、ファイルの中身が空でもif文の中を通るようになってしまいました。
ファイルサイズがうまくとれていないようなのですが、どこに原因があるのでしょうか。
クイックウォッチをしようしても中の値が見れません。。。。。
環境はMicrosoft Visual Studio .NET 2003 + WinXPです。
よろしくお願いいたします。

Aベストアンサー

ご質問の内容のプログラムでGetFileSizeは使えません。GetFileSizeを使用する場合、第一引数はCreateFileなどのAPIで取得できるファイルハンドルを使用します。

fopenの場合、ファイルディスクリプタですので、feof、fread、fseekなどを使用して、同様の機能を実現する必要があります。

QVisual C++でDESを使って文字列を暗号化したい

Visual C++初心者です。
文字列をDESを使って暗号化したいのですが、
C#のサンプルしか見つけられませんでした。
C++のサンプルがありましたら教えてください。

以上、よろしくお願いします。

Aベストアンサー

こんなのがありました。

DES Encryption Package
http://efgh.com/software/des.htm

ソースプログラム
http://efgh.com/software/desc.txt

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報