公開鍵暗号方式では、公開鍵で暗号化したものは秘密鍵で複合化出来るし、秘密鍵で暗号化したものは公開鍵で複合化出来ると言われています。ということは、特定の公開鍵に対応する秘密鍵は、本人が勝手に決められるものではなくて、公開鍵との間になんらかの関連性があるものでなければならないと思うのですが、違いますでしょうか?でももしそうだとすると誰でも公開鍵に対応する秘密鍵が作れてしまって、全然秘密ではなくなってしまうような気がするのですが。。。ご存知の方ご教授お願いします。

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

A 回答 (6件)

> >個人の公開鍵はいつ公開されるのか


> #1でちゃんと説明していますよ。

間違っています。ANo.1の状況では「サーバ証明書」だけが使われており「ユーザ証明書」は使われていません。言い換えれば「楽天の公開鍵」だけが使われており「ユーザの公開鍵」はまったく使用していません。

----------------
> 秘密鍵から公開鍵は生成できますが、逆はできません。(ANo.4)

誤解を生じやすい表現だと思います。

具体的に,定番のopensslの解説を見ていただきましょうか。
http://x68000.q-e-d.net/~68user/net/ssl-setup-1. …

openssl genrsa コマンドを実行することで「RSA秘密鍵を生成する」と,確かに一般的にはそのように表現します。でもその直後で確認している openssl rsa コマンドの実行結果から分かるとおり,server.keyファイルの中身には,

・modules(公開鍵/秘密鍵の共通要素): RSA 構造体の n に相当 (p*q)
・publicExponent(公開鍵となる指数): RSA 構造体の e に相当
・privateExponent(秘密鍵となる指数): RSA 構造体の d に相当

など,すべてのデータが格納されているのですよね。

であるなら,openssl genrsa コマンドは正しくは,

 > 鍵生成ソフトウェアを実行することで,
 > 公開鍵と秘密鍵のペアを生成します。
 > public keyだけ/private keyだけが
 > 生成されることはありません。

というANo.2で述べた動作をしているのであり,秘密鍵要素だけを生成しているのではないです。
そして以降では,秘密鍵ファイル server.key から公開鍵要素を抽出しているだけなのに,それを「秘密鍵から公開鍵を【生成できます】」といかにも計算で生み出しているかのように表現するのには違和感を持ちます。

----------------
> 1) まず本人が適当に秘密鍵を考える

上記で示したとおり,秘密鍵とはユーザが考えて決めた文字列ではありません。

----------------
> 本人の公開鍵はどうやって公開するのでしょうか?

http://oshiete.goo.ne.jp/qa/6226770.html の私の過去の回答ANo.2
    • good
    • 0
この回答へのお礼

なるほどです。ご親切なご回答有難うございました。再度読み返してみて、

> 鍵生成ソフトウェアを実行することで,
> 公開鍵と秘密鍵のペアを生成します。
> public keyだけ/private keyだけが
> 生成されることはありません。

の部分がキモだったように思います。片方からもう片方を作り出すことはそもそも無理なんですね(「n を素因数分解して、素数 p とq を求めることが非常に困難」 という点がポイントみたいですね)。そして公開鍵は必要になった時点で取りに行くというNo.1様の内容を考えれば、公開鍵が意味不明な文字列であっても問題はないというのも理解できます。

あと、過去のご回答にあった、

https://www.verisign.co.jp/basic/pki/index_pract …

はとてもわかりやすくて良いですね。こちらも有難うございました。

これで疑問は解決しました。恐らく来週の試験は乗りきれると思います:) 皆様ご回答有難うございました!

お礼日時:2011/04/22 01:57

>個人の公開鍵はいつ公開されるのか



#1でちゃんと説明していますよ。貴方がクレジットカードのボタンを押した瞬間に公開鍵を無意識のうちに使っているのですよ。
    • good
    • 0
この回答へのお礼

了解です!すみません、ちゃんと読んでいませんでした。。。

お礼日時:2011/04/22 02:02

>誰でも公開鍵に対応する秘密鍵が作れて



秘密鍵から公開鍵は生成できますが、逆はできません。
故に、公開鍵を公開しているからといって、公開鍵から秘密鍵を生成できませんのでセキュリティ上は問題うりません。
# 秘密鍵の管理が甘くて漏れる。とかいうのはこの場合は考慮外でしょう。
現状のコンピュータの性能では総当たりなどでも公開鍵から秘密鍵を生成するのは「現実的ではない」というのが担保ですかね。

で、公開鍵で暗号化したものは秘密鍵でしか複合できない。
秘密鍵で暗号化したものは公開鍵でしか複合できない。
ということで公開鍵で複合できれば、そのデータは秘密鍵を持つ人にしか暗号化できない。という証明になる。ということです。

暗号化・複合にはそれなりに手順があるので使用される場面が限定されることもままありますが。
# httpsなどのSSL通信とか。

この回答への補足

ご回答有難うございました。なんとなーく見えてきたのですが、まだ少しわからない点があります。

1. 個人の公開鍵はいつ公開されるのか

ご教授頂いた内容だと、鍵を作るサイクルは
1) まず本人が適当に秘密鍵を考える(これは秘密にしておく、当然ですが。。。)
2) 上記で考えた秘密鍵から公開鍵を作る(No.1様,No.2様からのご教授の内容から考えて、それ用のソフトを使うかそれなりの会社にお願いして。あるいは個人の場合はOSが勝手にやってくれるとか??)

という流れになるかと思うのですが、本人の公開鍵はどうやって公開するのでしょうか?というか、ひょっとしてNo.1様の書き込みのように、個人の場合でも公開鍵は最初から公開されているのではなくて、必要になった時点で必要とするマシンがその人のマシン勝手にアクセスして取りに行くのでしょうか?最初、公開鍵にはメールアドレスとかを使っているのかと思っていましたが、どうやら違ったようですね。。。汗

2. なぜ秘密鍵が作れないのか

ちょっと難しい話になってしまいそうですが、「公開鍵から秘密鍵は生成出来ない」というのはなぜでしょうか?逆のロジックを使えば出来るような気がするのですが。。。ひょっとしてランダム関数とかを使っているのかもとか考えましたが、そうだとすると一個の秘密鍵からいろんな種類の公開鍵が出来てしまうことになるし、それもおかしいかと思うのですよね。。。

すみませんが、補足お願いします。

補足日時:2011/04/21 13:17
    • good
    • 0
この回答へのお礼

ご回答有難うございました。貴重なご意見でした!

お礼日時:2011/04/23 01:36

>複合化



暗号化の反対語は復号です。「複」の字は間違いですし「化」は付きません。
    • good
    • 0
この回答へのお礼

ご指摘有難うございました!了解でございます!

お礼日時:2011/04/21 13:19

>特定の公開鍵に対応する秘密鍵は、


>本人が勝手に決められるものではなくて、
>公開鍵との間になんらかの関連性がある
>ものでなければならないと思う

そのとおりです。
鍵生成ソフトウェアを実行することで,公開鍵と秘密鍵のペアを生成します。
public keyだけ/private keyだけが生成されることはありません。
    • good
    • 0
この回答へのお礼

ご回答有難うございました。この部分がとても重要でしたね!

お礼日時:2011/04/22 02:01

貴方が楽天に貴方のクレジットカード番号を送る場合を例に取りましょう。

貴方は送るときには公開されているキーを使って貴方のクレジットカードを暗号し、それを楽天へ送ります。楽天はそれを解読するときには密かに持っているキーを使うのです。つまり公開キーは暗号化できるけれども解読することができないのです。ですから貴方が送った暗号化された番号をハッカーが盗聴して盗み取ってもそれを解読するスベがないのです。その公開鍵とペアになった秘密鍵を作る会社があり、それを楽天に売るのです。楽天は公開鍵だけをユーザーに提供して暗号化できるようにするのです。提供すると言っても貴方が『送る』というボタンを押したときには楽天が用意した公開ルーチンがその鍵を使って暗号化するので、貴方はその鍵を知っている必要は全くありません。
    • good
    • 0
この回答へのお礼

ご回答有難うございました。「提供すると言っても貴方が『送る』というボタンを押したときには楽天が用意した公開ルーチンがその鍵を使って暗号化する」という点がキモでしたね。貴重なご教授有難うございました。

お礼日時:2011/04/22 02:00

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

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

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

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

Q構造体のマスクというメンバ

一般的な構造体についての質問です。
例えば CHOOSECOLOR 構造体のようにメンバにマスクを持つ構造体があって、
その構造体に値を代入する関数を使うには、CHOOSECOLOR 構造体のマスクを
設定し、そのマスクで有効にしたメンバだけが値を入れられるんですよね?
マスクを持つ構造体というのは、それに値を入れる関数を使う前に
マスクを指定してから、その構造体のアドレスを関数の引数にセット
するんですよね?
マスクは無視されて、それ以外の全てのメンバに値が入るというわけでは
ないですよね?

Aベストアンサー

CHOOSECOLORにマスクは無いと思いますよ。
CHARFORMATですか?CHARFORMATならEM_GETCHARFORMATでbCharSetメンバだけに値を得ることになっているからEM_GETCHARFORMATするときのマスクは参照されません。
その他、SCROLLINFOとか普通のやつはマスクで有効にしたメンバだけがGet*()で得られるメンバです。

Q公開鍵暗号と共通鍵暗号について、

公開鍵暗号と共通鍵暗号について、
http://dev.sbins.co.jp/cryptography/cryptography02.html

http://mikilab.doshisha.ac.jp/dia/research/report/2005/0909/005/report20050909005.html
のレベルでは理解しているつもりです。
また、電子署名が、共通鍵暗号の仕組みで実現されていることもわかります。

 他方、
ネット上でパスワードを登録・入力する場合や、
SSLが、
公開鍵暗号なのか、共通鍵暗号なのかというレベルで、
どのように実現されているのかがわかりません。

 ご存じの方、よろしくお願いします。

Aベストアンサー

>また、電子署名が、共通鍵暗号の仕組みで実現されていることもわかります。
待った。公開鍵暗号方式です。

まず、ネット上でパスワードを登録・入力する場合ですが、
通常のプロトコルhttpであれば、共通鍵暗号になります。
パスワードが共通鍵となります。

で、SSLというhttpsプロトコルでは
公開鍵暗号と共通鍵暗号の両方の仕組みを使用しています。
簡単にいえば、最初に共通鍵を公開鍵暗号方式で送って
そのあとは、送った共通鍵で通信します。

まずクライアントはサーバー証明書という公開鍵をもらいます。
そのあと、クライアントは共通鍵を作成します。
クライアントで生成した共通鍵をサーバー証明書の公開鍵でもって
暗号化してサーバー側に送ります。
サーバーは暗号化された共通鍵を受け取ります。
この共通鍵はサーバー側の秘密鍵でもって復号化します。
サーバーはこれからやりとりする共通鍵を手に入れました。

あとはウェブサーバーであれば、
この共通鍵でホームページのデータを
暗号化してクライアントに送ってクライアントは復号化します。
このようにして通信します。

というわけでSSLの簡単な流れを説明しましたが、
認証局についての説明は省きました。
公開鍵を含んでいるサーバー証明書自体が
認証局の秘密鍵で暗号化されていて
・・・と
ややこしいのですが、あとは頑張ってください(笑)

参考URL
http://www.ibm.com/developerworks/jp/websphere/library/web/web_security/2.html

>また、電子署名が、共通鍵暗号の仕組みで実現されていることもわかります。
待った。公開鍵暗号方式です。

まず、ネット上でパスワードを登録・入力する場合ですが、
通常のプロトコルhttpであれば、共通鍵暗号になります。
パスワードが共通鍵となります。

で、SSLというhttpsプロトコルでは
公開鍵暗号と共通鍵暗号の両方の仕組みを使用しています。
簡単にいえば、最初に共通鍵を公開鍵暗号方式で送って
そのあとは、送った共通鍵で通信します。

まずクライアントはサーバー証明書という公開鍵をもらいま...続きを読む

Qqsortを用いた構造体配列のソート

お世話になります。

http://simd.jugem.jp/?eid=116
を参考にqsortを用いた構造体配列のソートをC言語で記述しようとしています。
上記のページは、構造体のメンバが配列でない場合です
今回は、メンバが配列のときの構造体配列のソートを実現したいと思っています。
つまり、
typedef struct{
int a;
int b[1024];
int c[1024];
}TEST;
という構造体配列があって、
TEST base[256];
と宣言し、メンバの配列の添え字を基準としてソートしたいときには、どのようにqsortを用いれば良いのでしょうか、ということです。
どうしたらよいかわからず途方にくれています。

つまり、下のようなソートが行われるには、どのようなプログラムを書けばいいかということです。

構造体でソートするものとします。
構造体でソートできれば、qsortを使っていなくても構いません。
プログラムの得意な方がおりましたら、ご教授下さい。

<ソート前>
//************************************************
test[ 0].b[0] = 3;
test[ 1].b[0] = 102;
...
test[255].b[0] = 1;
------------
test[ 0].b[1] = 99;
test[ 1].b[1] = 200;
...
test[255].b[1] = 2;
------------
...
------------
test[ 0].b[1023] = 99;
test[ 1].b[1023] = 9;
...
test[255].b[1023] = 200;
//**************************************************


<ソート後>:test[x]ではなく、b[y]を基準としてそれぞれのくくりをソートしたい
//************************************************
test[ 0].b[0] = 1;
test[ 1].b[0] = 3;
...
test[255].b[0] = 102;
------------
test[ 0].b[1] = 2;
test[ 1].b[1] = 99;
...
test[255].b[1] = 200;
------------
...
------------
test[ 0].b[1023] = 9;
test[ 1].b[1023] = 99;
...
test[255].b[1023] = 200;
**************************************************

お世話になります。

http://simd.jugem.jp/?eid=116
を参考にqsortを用いた構造体配列のソートをC言語で記述しようとしています。
上記のページは、構造体のメンバが配列でない場合です
今回は、メンバが配列のときの構造体配列のソートを実現したいと思っています。
つまり、
typedef struct{
int a;
int b[1024];
int c[1024];
}TEST;
という構造体配列があって、
TEST base[256];
と宣言し、メンバの配列の添え字を基準としてソートしたいときには、どのようにqsortを用いれば良いのでしょうか、という...続きを読む

Aベストアンサー

qsortは、ソート対象の個々の要素が連続していないと使えませんね。

1つのソートが256しかないのであれば、単純ソートを自分で書けば良いかと思います。
やや手抜きで書くと、

for(k=0; k<1024; k++){
for(i=0; i<255; i++){
for(j=i+1; j<256; j++){
if(test[i].b[k] > test[j].b[k]){
work=test[i].b[k];
test[i].b[k]=test[j].b[k];
test[j].b[k]=work;
}
}
}
}

Q公開鍵暗号方式を利用した下りデータの安全性について

公開鍵暗号方式については、
 ・公開鍵で暗号化したものは秘密鍵で復号できる
 ・秘密鍵で暗号化したものは公開鍵で復号できる
 ・秘密鍵は(もちろん)秘密だが、公開鍵は不特定多数に配布可能
が前提にあると理解しています。

SSLも公開鍵暗号方式を利用した通信プロトコルということですが、ここで、一つの疑問が湧きました。

信頼できるルートから署名された証明書を持つサイトで、SSLによって通信が暗号化される会員登録画面があったとします。
利用者は、氏名や住所などを登録画面に入力し、登録ボタンを押します。
この時、入力した情報は、サイトの証明書から入手した公開鍵で暗号化され、サイトに送信されるのだと思います。
ここで暗号化された情報は、サイトが持つ秘密鍵のみで復号可能ですので、鍵を持たない第三者が盗聴すること自体が無意味であり、安全であると言えます。

では、登録された情報を、利用者が確認のために表示する場合はどうなのでしょう?

今度は、サイトが持つ秘密鍵で利用者の情報を暗号化し、サイトの公開鍵によって利用者側で復号することになると思います。
しかし、前述したように、そのサイトの公開鍵は不特定多数の人が持っている可能性があります。

ということは、下りデータの通信を盗聴することで、同じ公開鍵を持つ第三者に復号されてしまうのではないかと考えたのですが、実際はどうなのでしょうか?

利用者が個人で秘密鍵を持っていない状況での通信というのがポイントです。

インターネットなどで調べてみたのですが、秘密鍵の所有者向きの通信を公開鍵によって安全に暗号化することを例とした説明が多く、先の疑問に対する明確な解答を見つけることが出来ませんでした。

また、ランダムに生成した共通鍵を公開鍵で暗号化するハイブリッド方式というものがあり、何か関連があるかと思ったのですが、公開鍵暗号方式のデメリットである処理速度の問題を補う手法という内容で、解決には結び付きませんでした。

ご存知の方がいらっしゃいましたらお教え下い。
宜しくお願いします。

公開鍵暗号方式については、
 ・公開鍵で暗号化したものは秘密鍵で復号できる
 ・秘密鍵で暗号化したものは公開鍵で復号できる
 ・秘密鍵は(もちろん)秘密だが、公開鍵は不特定多数に配布可能
が前提にあると理解しています。

SSLも公開鍵暗号方式を利用した通信プロトコルということですが、ここで、一つの疑問が湧きました。

信頼できるルートから署名された証明書を持つサイトで、SSLによって通信が暗号化される会員登録画面があったとします。
利用者は、氏名や住所などを登録画面に入力し、...続きを読む

Aベストアンサー

かなり知識のある方だと思いますので、SSLで調べればすぐに分かる話だと思います。
SSLの場合、以下、@ITからの抜粋ですが、
1)クライアントがSSLでのアクセスをサーバ要求します。
2)サーバは、サーバの公開鍵を含む証明書をクライアントに送ります。
3)クライアントは、証明機関の公開鍵を使って、証明書を復号、検証を行い、サーバ側の公開鍵を手に入れます。
4)クライアントは、一時的な共通鍵を生成し、サーバの公開鍵で暗号化して、サーバに送ります。
5)サーバは、クライアントから暗号化された共通鍵を受け取り、自分の秘密鍵で復号し、共通鍵を手に入れます。
6)同じ共通鍵で、クライアントとサーバは通信を始めます。

という動きになり、上り下りともに暗号化されています。

参考URL:http://www.atmarkit.co.jp/fdotnet/hybooks/vbnet03/vbnet03_01.html

Q条件によって構造体のリスト構造を変えたい

こんにちは。

C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。

条件によって構造体のリスト構造を変えたいのです。
例えば、
条件1の場合は
構造体a→構造体b

条件2の場合は、
構造体a→構造体c

上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。

文法上許されないようですが、イメージとしては、
struct a aa;
aa.c->b.aa

ということをしたいのです。よろしくお願いします。

struct a{
char a;
char b;
struct c;
:
};

struct b{
char aa;
:
};

struct c{
:
:
};

Aベストアンサー

一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。

struct a
{
 /* .bまたは.cのNULLではない方が有効 */
 struct b *b;
 struct c *c;
};

他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。

struct b
{
 char tag; /* 'b'を格納 */
 ...
};

struct c
{
 char tag; /* 'c'を格納 */
 ...
};

struct a
{
 union
 {
  struct b;
  struct c;
 } *p; /* .p->b.tagが'b'なら構造体b, 'c'なら構造体c */
};

好みかもしれませんが、私なら多分前者を使います。

一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。

struct a
{
 /* .bまたは.cのNULLではない方が有効 */
 struct b *b;
 struct c *c;
};

他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。

struct b
{
 char tag; /* 'b'を格納 */
 ...
};
...続きを読む

Q複数人にSSHの秘密鍵と公開鍵を設定

VPSを借りてまして、CentOS6.2です。

fooユーザとbarユーザとhogeユーザに、SSHの秘密鍵と公開鍵を設定するにはどうすれば可能(あるいはすべき)なのでしょうか?


ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/sorai/.ssh/id_rsa): // ファイル作成場所
Enter passphrase (empty for no passphrase): // パスフレーズを入力する
Enter same passphrase again: // パスフレーズをもう一度入力する

というのを、その人数分行わないとできないでしょうか?あるいはそうすべきでしょうか?

今、/root/.ssh/authorized_keysを /home/miya/.ssh/autauthorized_keysにコピーして、rootのとき成功した秘密鍵で、
miyaアカウントでSSHログインしようとしてもだめでした。
(ただ、パーミッションやユーザownerをどうすべきかわかりません)

よろしくお願い申し上げます。

VPSを借りてまして、CentOS6.2です。

fooユーザとbarユーザとhogeユーザに、SSHの秘密鍵と公開鍵を設定するにはどうすれば可能(あるいはすべき)なのでしょうか?


ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/sorai/.ssh/id_rsa): // ファイル作成場所
Enter passphrase (empty for no passphrase): // パスフレーズを入力する
Enter same passphrase again: // パスフレーズをもう一度入力する

というのを、その人数分行わないとできないでしょうか?...続きを読む

Aベストアンサー

>というのを、その人数分行わないとできないでしょうか?あるいはそうすべきでしょうか?

管理の都合上は別々にするべき…かと思いますけどね。
誰かが秘密鍵とパスフレーズを漏らしてしまった場合に公開鍵を無効にしたり…とかが、個別であれば対処が楽になるでしょう。
# 3人が同じ秘密鍵使っていて…誰から流出した時に他の2人に安全に別の秘密鍵を渡せるか?とかもあるでしょうし。

>今、/root/.ssh/authorized_keysを /home/miya/.ssh/autauthorized_keysにコピーして、rootのとき成功した秘密鍵で、
>miyaアカウントでSSHログインしようとしてもだめでした。

authorized_keysのオーナーは誰になっていのか?
とか、
/home/miya/.sshと/home/miya/.ssh/authorized_keysのパーミッションは?
とか、
ログになんか記録されていないか?
とか…いろいろありますけど。

>(ただ、パーミッションやユーザownerをどうすべきかわかりません)

/home/miya/.sshは600、authorized_keysのオーナーとグループはユーザーmiyaのもの。
でしょうかね。
# authorized_keysのパーミッションも600にする必要がある場合もありますけど。
rootのままだったとしたら読み込み出来なかったでしょうから、それなりのログが残っていませんか?

>というのを、その人数分行わないとできないでしょうか?あるいはそうすべきでしょうか?

管理の都合上は別々にするべき…かと思いますけどね。
誰かが秘密鍵とパスフレーズを漏らしてしまった場合に公開鍵を無効にしたり…とかが、個別であれば対処が楽になるでしょう。
# 3人が同じ秘密鍵使っていて…誰から流出した時に他の2人に安全に別の秘密鍵を渡せるか?とかもあるでしょうし。

>今、/root/.ssh/authorized_keysを /home/miya/.ssh/autauthorized_keysにコピーして、rootのとき成功した秘密鍵で、
>miya...続きを読む

Q構造体配列の安定なソート

出席番号と得点の配列を持つ構造体配列で、
出席番号順に並んだ状態でqsortを使って得点をソートする場合、
同じ得点の人でも、出席番号順はばらばらになってしまいますよね。

調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、
qsortは標準ライブラリにあって、
比較関数も見よう見まねで作ってなんとかなったのですが、
他の方法となると具体的にどうすればいいのか、
よくわからない状況です。

http://homepage1.nifty.com/daccho/program/algo/sort3.htm

こちらのサイトのソースファイルを見て、
普通のint配列のバブルソートは出来たのですが、
構造体配列を、構造体の中の一つの要素をキーにバブルソートできるようにするには、
ここからどのように変更すればいいのでしょうか?

並び替える内容はint型だけなので、文字列をソートできるようにする必要はなく、
ソート対象も少ないので(上限100程度)、速度的な問題は考慮しなくて大丈夫だと思います。

Cは勉強中で、基本文法がわかるぐらいという状況で、
もしかしたら変なことを言っているのかもしれませんが、
よろしくお願いします。

出席番号と得点の配列を持つ構造体配列で、
出席番号順に並んだ状態でqsortを使って得点をソートする場合、
同じ得点の人でも、出席番号順はばらばらになってしまいますよね。

調べてみて、バブルソートなど安定なソートを使えばいいということが分かったのですが、
qsortは標準ライブラリにあって、
比較関数も見よう見まねで作ってなんとかなったのですが、
他の方法となると具体的にどうすればいいのか、
よくわからない状況です。

http://homepage1.nifty.com/daccho/program/algo/sort3.htm

...続きを読む

Aベストアンサー

>構造体のメンバを引数に渡すにはどうすればいいかとか、
>bubble_sort(&table[0].score, 10);
bubble_sort(&table[0], 10)
とすればいいと思います。
>メンバの配列を比較してメンバの順番だけ入れ替えたら、
>名前と得点の対応が壊れるから、
構造体自体は、出席番号と得点を保持しているのだから、
出席番号から名前が引き出せるのであれば、対応をとる必要はないと思うのですが、構造体の配列の並びがどっか別にある名前テーブル(配列?)と対応しているということであれば、名前テーブルも並び替える必要があるのかなぁとか思いますが、そんな必要はないような気がします。
なんか、どういうデータ構造になっているかよくわからないので、勘違いしてたらすみませんです。
できたら、バブルソート版のプログラムを補足していただけますか?

Q公開カギ暗号方式は本当に安全なのでしょうか?

このまえテレビで、情報を送るときの暗号化についてやっているのを見て
公開カギ暗号方式が安全だといっていましたが、本当に大丈夫なのでしょうか?100%他人に盗まれ解読されるようなことは無いと言い切れるのですか。

Aベストアンサー

>100%他人に盗まれ解読されるようなことは無いと言い切れるのですか。

多分、誰も言い切ってないですよ。言い切ってる人がいたら「わかっちゃない」人です。
・現在のコンピュータや通信システムの性能で
・そこそこ使いやすくて
・復号(ちゃんと暗号文を元に戻す事)がそんなに大変じゃなくて
・解読(不正な方法で暗号文を元に戻す事)がやるのがとんでもなく手間がかかって=事実上やる気にならないくらいで
さらにここが重要なんだけど、
・結構たくさんの人が利用している
のが、現在の公開鍵方式です。
もちろん鍵長やアルゴリズム、規格などなど幾つかありますけど....。

で、本当に大丈夫?というと、
「まぁ、今のところ、ちゃんと使ってれば、事実上、大丈夫でしょ」
という事です。
今の暗号化のアルゴリズムや鍵長が10年後には一番安いPCで「あっ」というまに解読されちゃう、なんてことはあると思いますけど、当面は多分大丈夫じゃないかな?と考えてます。
#この辺、技術の進歩と背中あわせ....。

100%他人に盗まれ解読されないアルゴリズムを作れたら、ビルゲイツも真っ青の億万長者になれますよ。
#誰か、思いついたらナイショで教えて....(^^ゞ

>100%他人に盗まれ解読されるようなことは無いと言い切れるのですか。

多分、誰も言い切ってないですよ。言い切ってる人がいたら「わかっちゃない」人です。
・現在のコンピュータや通信システムの性能で
・そこそこ使いやすくて
・復号(ちゃんと暗号文を元に戻す事)がそんなに大変じゃなくて
・解読(不正な方法で暗号文を元に戻す事)がやるのがとんでもなく手間がかかって=事実上やる気にならないくらいで
さらにここが重要なんだけど、
・結構たくさんの人が利用している
のが、現在の公開鍵...続きを読む

Q構造体→文字列→構造体 をする方法

VB6.0の話です。

 不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?

 具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。
 共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。

Aベストアンサー

APIを使えば出来ます。

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (cStr1 As Any, cStr2 As Any, ByVal iLen As Long)


構造体→文字列
Call CopyMemory(strB, ByVal typeA, Len(typeA))

文字列→構造体
Call CopyMemory(typeA, ByVal strB, Len(typeA))

ただし構造体のメンバに配列があると使えません(VBの配列はメモリを連続してとらない為、メモリーリークします)。

また構造体の中身は string *5 などの固定長である必要があります。

以上です。

Q共通鍵暗号方式

共通鍵暗号方式でAさんとBさんがメッセージを送る場合は、
AさんとBさん専用の共通鍵が一個あればよいと理解してるのですが、
ここで質問です。

例えば、Aさんがメッセージを共通鍵で暗号化しBさん宛に
メッセージを送信しますよね。その時、いっしょに共通鍵を送りますよね?
で、Bさんは送られてきたメッセージを共通鍵で復号化して読みます。

しかしまた、AさんからメッセージをBさん宛に送りたい場合は、
Bさんから共通鍵だけ送り返してもらわなければ、ダメってことで
いいのでしょうか?

Aベストアンサー

> よく鍵の数を答える問題があって、100人いたら
> 鍵の数は100*(100-1)/2で4950個
> になるのですが、合鍵の数も入れると9900個に
> なりませんか?
> あくまでも鍵の型の数ってことなのでしょうか?

鍵の数は、100*(100-1)で9900個
鍵の種類(型)は2個1ペアで1種類になるので、100*(100-1)/2=4950個になりますね

http://itpro.nikkeibp.co.jp/article/COLUMN/20060601/239679/
でも4950種類になっています
絵では鍵が1つしか描かれていませんが、これをお互いに持っているというイメージです

普通、南京錠を買うと鍵が2個付いてくると思います
これをお互いに持っていれば、
・鍵が持っている人同士は南京錠が開けられる
・鍵を持っていない人が南京錠を拾っても、鍵がないので開けられない
という感じでセキュリティを保っているわけです


人気Q&Aランキング

おすすめ情報