シーザー式暗号解読の必要なコードは?

解決


ヤンマー  2008-12-03 21:27:35  No: 140986

初めまして!学校の先生から出されたvisual basicの暗号解読が分かりません..誰か分かる方助けてください!!
  先生の出されたヒントを載せます
下にある命令を使い、シーザー式暗号(文字を一定の数だけずらす)を作ったり、解読するプログラムを作りなさい。

    以下

シーザー式暗号の例
オフセットが2の場合:abcdefg  →  cdefghi

プログラムのひな型はマテリアルにあるフォルダ「暗号」を、マイドキュメントにコピーして、
ファイル名の頭に学籍番号を付けくわえて使いなさい。

完成したプログラム(exeファイル)はfrm、vbpファイルと共に、学籍番号をファイル名にしたフォルダに入れ、
1月14日の2時限目が終わるまでにパブリックドライブの「暗号」というフォルダに提出すること。

Len(string)  string(文字列)の長さを求める

Asc(chara)  charactor(文字)のアスキーコード(何番目の文字か)を求める

Mid(strin, i, j)  string(文字列)のi番目のj文字(個数)を求める

Chr(n)    アスキーコードでn番目の文字を求める

また、完成したプログラムを使い次の文章を解読する。。。

        そして、以下のコードの足りない箇所がわかりません!!

          以下

Private Sub Button1_Click() '暗号化ボタン

Hira = Text1.Text
Counter = Len(Hira)
zure = Val(Text3.Text)

Ango = ""
For i = 1 To Counter    '入力用の文字列を1文字ずつ処理します。

    Code =             'Mid関数で1文字ずつ入力文字列を取り出し、その文字コードを得てオフセットの分ずらします。それをCodeに入れます。
    
    Ango =              'AngoにずらしたCodeを付け加えます。
    
Next i

Text2.Text = Ango
End Sub

Private Sub Button2_Click() '復号化ボタン

Ango = Text2.Text
Counter = Len(Ango)
zure = Val(Text3.Text)

Hira = ""
For i = 1 To Counter

    Code =

    Hira =
   
Next i

Text1.Text = Hira
End Sub

誰かわかる方助けてください。初心者で本当に困ってます。


じぇい  2008-12-04 06:38:12  No: 140987

> 誰かわかる方助けてください。初心者で本当に困ってます。
宿題でしょ?自分でやんなさいよ。
宿・・・住処
題・・・解決すべき問題
あなたの住処で解決するべき問題。
初心者ねぇ。。。今までちゃんと授業出てたなら、初心者じゃないよ。

> 'Mid関数で1文字ずつ入力文字列を取り出し、
> その文字コードを得てオフセットの分ずらします。
> それをCodeに入れます。
わかってるじゃん。1行で書くから難しくなるの。3行に分けなさい。

> 'AngoにずらしたCodeを付け加えます。
ちがうよ。「Code を文字にする」だよ。

  ところで。ずらす文字数が25文字を超えたら、どうなるの?(25で A→Z。26だと?)
同じ事だけど、2文字ずらすとしたときに、Y, Z は、それぞれなんになるの?


回答者w  2008-12-04 19:12:38  No: 140988

>初めまして!学校の先生から出されたvisual basicの暗号解読が分かりません..誰か分かる方助けてください!!
>  先生の出されたヒントを載せます
大変申し訳ないのですが、いただいたヒントだと情報が足りません。
参考までに学校名と、先生の名前を教えてもらえませんか?
直接その先生と連絡を取りたいので。


ヤンマー  2008-12-05 01:41:50  No: 140989

学校は理大です?
先生は伊藤准教授です?


回答者w  2008-12-08 19:38:12  No: 140990

>学校は理大です?
>先生は伊藤准教授です?
すみません、どこの理大でしょうか?
また、准教授のフルネームを教えていただけますか?
予想はつくのですが、連絡をとって人違いだったというのも大変申し訳ないので。


ヤンマー  2008-12-17 20:39:28  No: 140991

回答者w様
  12月4日のヤンマーは偽物です。
担当の教授に聞いたところ名前は公表できないといわれてしまいました。
あと、もうひとつわかったことは、、
「オフセットは1〜9のあいだ」ということです。
  かなり一方的に問題の解決法を聞いてしまって申し訳ありません。
私は文系の大学に通っています。今回の全く見当もつかないvbの問題を出されてしまって困っています・・。


とおりすがり  2008-12-18 12:26:31  No: 140992

>そして、以下のコードの足りない箇所がわかりません!!
>Code =             'Mid関数で1文字ずつ入力文字列を取り出し、その文字コードを得てオフセットの分ずらします。それをCodeに入れます。
    
>Ango =              'AngoにずらしたCodeを付け加えます。

わからないのが、Code,Angoの処理なら・・・
じぇいさんの書いてることを読み直して、よく考えてみましょう。

> その文字コードを得てオフセットの分ずらします。
Asc()を使って得た数値にzureを足すということです。

文系か理系かはあまり関係ありません。
プログラミングは言語をあつかうので、むしろ文系向きだと書いてある本すらあります。


とおりすがり  2008-12-18 12:27:28  No: 140993

>Asc()を使って得た数値にzureを足すということです。

zureを足し引きするということです。訂正


VB8日目  2008-12-24 21:32:10  No: 140994

完全な文字テストとかをしたわけじゃないんですが、スタディ代わりに作ってみました。
一応私の考えどおりに動きます。

動作させるためにフォームなどは適当に作ってください。
メインフレーム(Form1) ボタン2つ(Button1、Button2) テキストボックス4つ(Text1〜Text4)です。

public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Hira As String
Dim Counter As Integer
Dim zure As Integer

Hira = Text1.Text
Counter = Len(Hira)
zure = Val(Text3.Text)
Text4.Text = "正常"

Dim Ango As String
Ango = ""
For i = 1 To Counter    '入力用の文字列を1文字ずつ処理します。
    Dim Code As Integer

    If False = Char.IsLetter(Mid(Hira, i, 1)) Then Text4.Text = "a-Zを指定してください" : Exit Sub

    Code = Asc(Mid(Hira, i, 1)) + zure 'Mid関数で1文字ずつ入力文字列を取り出し、その文字コードを得てオフセットの分ずらします。それをCodeに入れます。

    ' アスキーコード値オーバー
    If Code > Asc("Z") And Code < Asc("a") Then Code += Asc("a") - Asc("Z") - 1
    If Code > Asc("z") Then Code -= Asc("z") - Asc("A") + 1

    Ango += Chr(Code)         'AngoにずらしたCodeを付け加えます。

Next i

Text2.Text = Ango

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Ango As String
Dim Counter As Integer
Dim zure As Integer
Dim Hira As String

Ango = Text2.Text
Counter = Len(Ango)
zure = Val(Text3.Text)

Hira = ""
For i = 1 To Counter
    Dim Code As Integer

    If False = Char.IsLetter(Mid(Ango, i, 1)) Then Text4.Text = "a-Zを指定してください" : Exit Sub

    Code = Asc(Mid(Ango, i, 1)) - zure 'Mid関数で1文字ずつ入力文字列を取り出し、その文字コードを得てオフセットの分ずらします。それをCodeに入れます。

    ' アスキーコード値オーバー
    If Code > Asc("Z") And Code < Asc("a") Then Code -= Asc("a") - Asc("Z") - 1
    If Code < Asc("A") Then Code += Asc("z") - Asc("A") + 1

    Hira = Hira.Insert(Len(Hira), Chr(Code))         'AngoにずらしたCodeを付け加えます。

Next i

Text1.Text = Hira

End Sub
End Class


VB8日目  2008-12-24 21:50:38  No: 140995

書き忘れましたが、↑の環境はVB2008 (VS2008Express)です。


出題者  2008-12-29 02:06:24  No: 140996

この授業で使っているVBは、ver.6.0です。
2008や.NETのコードは走りません。
悪しからず。(苦笑)

じぇいさんの指摘の通りですが、この授業は文系の初心者対象ですので
条件分岐まで求めていません。
また「また、完成したプログラムを使い次の文章を解読する...」の文章は
漢字まじりのものですので、漢字コードまで考慮するのは初心者には無理だと思っています。


出題者  2008-12-29 02:28:31  No: 140997

書き忘れましたが、

皆さん、うちの学生がご迷惑をかけて申し訳ありませんでした。m(--)m

課題を出したときに、歯抜けにしたコードと幾つかのヒントとなる単語を与えてあり、
それらの単語をキーワードにググれば見本となるコードが見つかるはずです。
あとは、その見本と歯抜けのコードを比較し、ラベルの言い換え、
穴埋めをすればとりあえず動くものになるはずです。

これ以上の助言は無用に願います。
ありがとうございました。  >  回答者の皆様


とおりすがり  2008-12-29 06:55:25  No: 140998

>それらの単語をキーワードにググれば見本となるコードが見つかるはずです。

ググってOKなら・・・
確かに見つかりますね。VB6.0のコード(笑


ヤンマー  2009-01-02 09:43:45  No: 140999

回答者の皆様
ありがとうございました<m(__)m>


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加