A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
返事を付けてくださってありがとうございました。
どうなさったのか、気にしていましたから。
間に合わなかったら、悪いことをしたと思っていたからです。
>→大学の情報処理演習という授業です
実は、ここが気になってました。私にもう一度チャンスがあれば、こういうことを勉強してみようか、なんて思いました。放送大学で2科目はやってみましたが、実際、なかなか難しいです。
インストラクター講座の時に、もっと単純な、うるう年かどうかの判定のフローチャートを書けという問題でさえ、みんな四苦八苦してしまいます。
私も勉強してみようと思いました。
なお、ここで解答を得られる人ばかりではないので、ラッキーだったかもしれません。
No.9
- 回答日時:
そろそろ解答を書いておきます。
THE VIGENERE CIPHER IS AN EXAMPLE OF A POLYALPHABETIC SUBSTITUION CIPHER,
IN WHICH EACH SUBSEQUENT LETTER USES A DIFFERENT SHIFT. AFTER A WHILE THESE SHIFTS CYCLE.
THE SEQUENCE OF SHIFTS IS REPRESENTED BY A CODEWORD CONSISTING OF LETTER SHIFS.
FOR EXAMPLE. IF THE CODEWORD IS "REMARKABLE", THEN THE FIRST LETTER OF THE MESSAGE WOULD SHIFT BY 17, THE SECOND LETTER BY 4,,,,, THE 7TH LETTEER BY 0, ETC,
THE 11TH LETTER WOULD SHIFT BY 17 AGAIN LIKE THE FIRST AND THE CYCLE WOULD REPEAT.
訳は自信ががありませんが、付けておきます。
ヴィジュネル暗号は、ポリアルファベット置き換え暗号の一例です。そして、何文字か過ぎてシフトはサイクルし、それぞれの文字に違うシフトが使われる。シフトの結果は、文字シフトで構成された暗号コードによって表される。
例えば、暗号コードは、"REMARKABLE"でしたら、単語の最初の文字は、17でシフトされ、二番面は、4によって、……、7番目の文字は0によって……、11番目の文字は、17に再び最初のようにシフトされ、このサイクルは繰り返される。
お礼遅くなって申し訳ありません。
回答本当にありがとうございます!
とてもとても助かりました!感謝しています!全くといっていいほどプログラムがわからなかったのですが、
WindFallerさんとtaisukeさんのお力のおかげで理解することができました!難しいですが、理解できれば面白いですね!
WindFallerさんの訳と自分で訳したやつはほとんど同じでした!
ところで、この授業は、なんの授業でしょうか?
→大学の情報処理演習という授業です
課題の提出期限はあと2日ほどあります!余裕をもって取り組むことが出来ました!ありがとうございます!!!
taisukeさんもWindFallerさんも丁寧に、とてもわかりやすく教えて下さり本当にありがとうございました!
本当に感謝です!
これからも教えて下さったことを活かして授業を頑張っていこうと思います!
最後にもう一度、ありがとう!
No.8
- 回答日時:
追伸、全文の復号化終わりました。
暗号文の下から二段目のTYODT4の後は、私のモニターでは、点(カンマ?)がいくつか見えません。
正解は5個です。
この問題を出した人は、わざとではないでしょうか。
繰り返し、マクロで探しなさい、ということでしょう。
(ヒントには、そう書いてはありましたが、そんなのは余裕がある人だけです。)
ところで、この授業は、何の授業でしょうか?
今、1月だから、この解答提出が、学期末になるのでしょうか?
ちなみに、英文は、そのままでも読めると思いますが、
Micrsoft の翻訳サイトは、とてもよいです。
画像では、カンマとピリオドがはっきりしませんので、文章的に直したほうが良い場合があります。
翻訳サイトは category を選定できますが、一般的に、general で、文章がこなれるようです。
https://www.bing.com/translator?category=general …
No.7
- 回答日時:
ちょっと、元のコードの説明をしておきますね。
擬似乱数を知ったのは、もう昔なので、現役の方のほうがはっきりしていると思います。
大事なのは、ここですよね。
Rnd -1: Randomize Key
擬似乱数のパレットを固定していると思うのです。そこで、パレットを一定にして乱数を固定しないと、バラバラになってしまうのです。そこで、空白「32」を一旦「64(@)」にして、更に暗号化していますから、わかりづらくなっています。
当初、総当り制ではなく、ありえない文字の組み合わせに、エラーを出すことも考えましたが、acronymもありますので、探すのは断念しました。
今回の場合、私個人が上手くいかない理由は、この暗号文が画像ファイルで、仮に、1文字ズレても、わからなくなってしまう、ということです。電子ファイルでも与えられたら、安心して行えるのですが、ヒントの内容からして、おそらく、元から印刷のデータをよく見て修正しながら、直せという趣旨ですから、それは、また別問題です。このままだと、最終解読にまでは、まだ時間が掛かりそうです。一応、OCRは通しましたが、記号の羅列では、かなり難しいことが分かりました。
書いてある内容は、最初の部分は分かったのですが……
"THE VIGENERE CIPHER IS AN EXAMPLE OF A POLYALPHABETIC SUBSTITUION CIPHER, IN WHICH EACH SUBSEQUENT LETTER USES A DIFFERENT SHIFT. AFTER A WHILE THESE SHIFTS (ここから乱れてしまいました)....
ちなみに、「ヴィジュネル暗号」というのは初耳です。
この英文は、文字の次から次に、違うシフト(数字)を与える暗号だということです。
'//一応、標準モジュールでお願いします。
'Option Explicit
Sub FindCipherKey()
'暗号解読の総当り制プログラム
'何も入力していないシートをお使いください。
'目視でシートから探します。
Dim Ciphertxt As String
Dim i As Long, j As Long
Dim Ret As String
j = 1
Ciphertxt = "BDQHYMLNRP@"
For i = 1 To 32767
If i Mod 197 = 5 Then
Ret = DecodeFunc(Ciphertxt, i)
Cells(j, 1).Value = i
Cells(j, 2).Value = Ret
j = j + 1
DoEvents
End If
Next
End Sub
Sub SolivingCipher()
'全文を解読(シートを変えてください)
Dim Ciphertxt As String
Dim Key As Integer
Dim Ret As Variant
Key = 19114 '←A列で見つけた数字をここに入れます。
'暗号文をA1に置いてください。
Ciphertxt = Range("A1").Value
Ret = DecodeFunc(Ciphertxt, Key)
Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = Ret
End Sub
Function DecodeFunc(ByVal Ciphertxt As String, ByVal Key As Long)
'暗号解読ユーザー定義関数 [argument:暗号テキスト, キー]
Dim shift As Integer
Dim n As Integer, x As Integer
Dim decode As String
Rnd -1: Randomize Key
For n = 1 To Len(Ciphertxt)
shift = Int(Rnd() * 27)
x = Asc(Mid(Ciphertxt, n, 1))
If 64 <= (x - shift) And (x - shift) <= 90 Then
x = x - shift
ElseIf (x - shift) <= 64 And x >= 64 Then
x = x - shift + 27
End If
If x = 64 Then x = 32
decode = decode + Chr(x)
Next n
DecodeFunc = decode
End Function
'//
p.s.
>#5のtaisuk555さんの
ハンドルの名前、間違えてしまいました。 taisuke555さんでした。お詫びと訂正いたします。
No.6
- 回答日時:
#5のtaisuk555さんの
>Keyは19114で合っていますか?
先を越されてしまいました。というか、一旦寝ていましたから。
今、試してみたところ こちらのコードでも、Keyは、19114 (98番目)ではないかと思います。
一応、暗号解読プログラムはできましたが、何か、とことん、私は、ヒントは読み違えるし、早合点と、ミスの連発していました。こういう時は、慎重にしたほうがよいと思いました。明日、また検証してみます。
>これを1つ1つプログラムに入れて実行し、英文になっているのを見つけるしか方法はないのでしょうか。
そのとおりです。167個全部を見なくてはなりません。
それと、これは、やはりシーザー暗号の変形ですね。
それさえわかれば、後は、答えは自ずと出るはずです。
No.5
- 回答日時:
プログラムの内容はあまり理解していませんとの事ですので、
#2の方が軽く説明してますけど、もう少し詳しく説明します。
For n = 1 To Len(original)
shift = Int(Rnd * 27) '0~26の乱数を作成
'originalのn番目の文字を文字コードに変換
'Asc(" ") = 32 '(スペース)
'Asc("A") = 65: Asc("a") = 97
'Asc("Z") = 90
'Asc("@") = 64
x = Asc(Mid(original, n, 1))
'x=32(スペースの文字コード)ならば x=64(@の文字コード)に変更
If x = 32 Then x = 64
'文字コードが64~90ならば(@と大文字A~Zの文字コードならば)
If 64 <= x And x <= 90 Then
'文字コードに乱数を加算
x = x + shift
'文字コードが90以上ならば(大文字Zよりも大きかったら)
'文字コードから27を引く
If 90 < x Then x = x - 27
End If
'乱数を加算した文字コードを文字に変換してつなげる
cipher = cipher & Chr(x)
'Chr(64) = "@"
'Chr(65) = "A"
Next n
たとえば
[A]に乱数2を足すと[C]、
[X]に乱数4を足すとZより大きくなるから@から数え直してA
Asc("X")=88 88+4=92 90以上なので 92-27=65 chr(65)="A"
のように文字をシフトさせているわけです。
@ABCD・・・XYZ@ABCD
スペースを@に変換しているのは、このシフトさせるのに
1文字だけ32と離れていてプログラムが複雑になるからAの1つ前の@にして
プログラムを簡単にしているだけだと思います。
Keyは19114で合っていますか?
このヒント&アドバイスを見る限り英文になっているか1つずつ見るしか
ないような気がします。
私はとりあえず 先頭の30文字を20個づつ表示して確認する方法で調べました。
私は暗号化のプログラムを作ったことがないので、もしかしたら確認しなくても
簡単に見つける方法があるかもしれません。
スペースまでの単語をネットで検索し、単語があるか自動で調べる事は
出来そうですけど、何かの課題みたいですから、きっと
そこまでのプログラムは要求してないですよね。
WindFallerさんがプログラム作ってくれているみたいなので、
私の下手なプログラムは載せませんけど答えが知りたかったので一応書いてみました。
@を空白にするには
If x = 32 Then x = 64の部分を逆にすればいいです。
If x = 64 Then x = 32
お礼遅くなって申し訳ありません。
とても詳しくありがとうございます!
Keyは19114であっていました!
なんとなくですが、プログラムを理解することができました。理解できれば面白いですね!これからも頑張っていこうと思います!ありがとうございました!
No.4
- 回答日時:
#2の回答者です。
一応、暗号のプログラムはやったことがありますが、今時、VBAでも、そのようなコードは書きません。問題は、Key を見つけることですが、要するに、この問題の趣旨は、復号化プログラム(解読プログラム)を作れということですね。
そのヒントを読むまで、私は、勘違いしていた部分があります。
>解読した時に@となるところを空白にするにはどうすればよいでしょうか?
実は、これがネックだったのです。空白が@ を更に、乱数で一定の数値にならなかったからです。もしかしたら、それってワザと混乱させるために作られたものでは?
他にも勘違いしていた部分がありますが、それは、なんとなく、ミスしているようなコードだからです。
空白を入れるなら、64 ->@ ですから、そのまま、32を入れればよいだけです。
' If x = 32 Then x = 64
この行を削除するか、コメントアウトしてください。
後は、もう少し時間ください。
それと、最初からこれだけの情報を与えてくれていたら、もう少し話の展開が早かったと思います。
No.3
- 回答日時:
プログラムのどの部分が分からないのでしょうか?
プログラム自体はそれほど難しい事をしていないので、
#2さんと同じ
なぜ、ランダムの数字を使って暗号化できるのか?
という事でしょうか?
そうだとすれば、
Sub a()
key=2017
Rnd -1: Randomize key
For i = 1 To 10
dat = dat & Int(Rnd * 27) & ","
Next i
Msgbox dat
End Sub
を実行すると必ず同じ乱数が表示されます。
(質問のプログラムでも必ず同じ文字列が表示されていると思いますが)
これは、randomizeのヘルプに書かれていますが、
メモ 乱数系列を繰り返すには、数値を指定して Randomize ステートメントを実行する直前に、負の引数を指定して Rnd 関数を呼び出します。引数 number に同じ値を指定して Randomize ステートメントを使用しても、前の乱数系列を繰り返すことはできません。
とあり Rnd -1を実行する事により、Keyで乱数を初期化する事ができます。
これでKeyさえ分かれば、元に戻す事ができます。
そういう質問でなければ、具体的にどの部分が分からないのか
書いた方が、回答者も回答しやすいですよ。
そうですね、質問の仕方が良くなかったです。
なるほど、正しいkeyを見つければ乱数を初期化する事ができて暗号を解読する事ができるのですね!ありがとうございます。
No.2
- 回答日時:
それは、個人が作ったものでしょうか?
VB.Net ではなく、VB6系の古いコードのようです。
Excelでも、最近は、このようには書かないようです。
これは、古典的なシーザー暗号に似ています。
意味というよりも、私は、この種のプログラムは昔少し勉強したけれども、残念ながら、今回のコードは、よくわかりません。
x=0~27 まで任意の乱数
その乱数を、x に与えて、暗号化できても、どのようにそれを復号化するのか見えないので、このコードが分からないのです。
If x=32 Then x =64 は、空白があれば、@ に変えろというコードです。
しかし、その変えた@を再び変えようとしています。
If 64 <=x And x <= 90 Then
x = x+ shift で、暗号化していますが、
ここでのshift とは乱数で、keycode ではないので、それを記録でもしなければ、元にはもどらないと思うのです。
できれば、このコードの対になっている復号化プログラムを出してください。お願いします。暗号化(encryption)しているからには、復号化(decryption)ができるはずです。これは、その反対の復号化コードがなければ意味がありません。
インターネットで同様のものを探しましたが、見つかりません。
これは授業の課題でヒントとしてでたものです。このプログラムを理解して課題に取り組めとのことでした。
復号化プログラムとやらは出されていません。どのような課題なのか上の方に貼っておきます。
回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelシートのある番地の文字が一致したすべての行を別シートに転記する方法 11 2022/10/25 08:43
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Visual Basic(VBA) Excel VBA シートを追加後に余分なシートを削除する、の意味 21 2022/05/19 22:46
- XML MSFormsとは何ですか? 2 2022/05/02 09:38
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/06/22 11:19
- Excel(エクセル) 【VBA】ファイルパスに半角スペースが入ると、VBAが動かない 5 2022/08/04 20:52
- Visual Basic(VBA) VBA にて、条件付き書式で背景色を設定しているセルの範囲で、背景色付きのセルをカウントできる、VB 2 2022/04/06 21:33
- Visual Basic(VBA) Excel VBA カーソルを当てた際に表示される”4161”とは 1 2022/04/30 21:53
- Excel(エクセル) Excel VBA 指定セルに入力されているパスからシートをコピーして別のブックに転記するVBAのコ 2 2022/04/19 15:53
- Excel(エクセル) Excelのvbaについて教えてください。 図形一つ一つに名前がついています。 指定した図形の名前を 2 2022/08/04 15:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
VBAでユーザーフォームが自動的...
-
Excelで4096点以上のFFTの方法
-
PICマイコンのコピー(クローン...
-
未使用の変数を一括検索する方法
-
1. 仮想CPU「exmini」を使用し...
-
読み込み中にアクセス違反が発...
-
画像を読み込むのと取り込むの...
-
Javaで2の0乗から-8乗まで表示...
-
COBOLでBLOCK CONTAINS句につい...
-
VBAにてメール作成した際、一部...
-
PCの起動確認プログラム
-
プログラムを斜めに並べる
-
エクセルとワードをデスクトッ...
-
main関数を先頭に置くデメリット
-
socketでの複数NICの扱い
-
C言語についての質問です。 n(>...
-
プログラムの実行時間
-
Excelに埋め込んだVBAのプログ...
-
LINUX用CプログラムのWindows移...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
Vba 実数および実数タイプの変...
-
インクリメント演算子のみを用...
-
スポーツ施設での出来事で心配...
-
VBAにてメール作成した際、一部...
-
VBAでユーザーフォームが自動的...
-
Excelに埋め込んだVBAのプログ...
-
Notepad++の関数リスト表示でC...
-
PICマイコンのコピー(クローン...
-
「Outlookが他のプログラムによ...
-
読み込み中にアクセス違反が発...
-
未使用の変数を一括検索する方法
-
自動クエリとはどういうもので...
-
エクセルとワードをデスクトッ...
-
binファイルってiphone専用です...
-
ドロップダウンリストの文字を...
-
UWSCで指定のフォルダを開きたい。
-
モジュール、アプリケーション...
-
パックマンプログラム
おすすめ情報
これは課題のヒントです。
これが出された課題です。
プログラムの内容はあまり理解していませんが、taisukeさんの回答でkeyを見つければ良い事が分かったので、『暗号化のkey はinteger型の変数に格納可能な正の整数で、素数197で割ったとき5余る』というヒントから考えた所、keyが167個見つかりました。これを1つ1つプログラムに入れて実行し、英文になっているのを見つけるしか方法はないのでしょうか?
それと、解読した時に@となるところを空白にするにはどうすればよいでしょうか?
これが課題です。
質問に貼ってあるプログラムはこれを理解して課題に取り組めと出されたプログラムです。