dポイントプレゼントキャンペーン実施中!

このVBAの意味を教えて下さいm(_ _)m

「このVBAの意味を教えて下さいm(_ _」の質問画像

質問者からの補足コメント

  • これは課題のヒントです。

    「このVBAの意味を教えて下さいm(_ _」の補足画像1
      補足日時:2018/01/19 17:04
  • これが出された課題です。
    プログラムの内容はあまり理解していませんが、taisukeさんの回答でkeyを見つければ良い事が分かったので、『暗号化のkey はinteger型の変数に格納可能な正の整数で、素数197で割ったとき5余る』というヒントから考えた所、keyが167個見つかりました。これを1つ1つプログラムに入れて実行し、英文になっているのを見つけるしか方法はないのでしょうか?
    それと、解読した時に@となるところを空白にするにはどうすればよいでしょうか?

      補足日時:2018/01/19 17:11
  • これが課題です。

    「このVBAの意味を教えて下さいm(_ _」の補足画像3
      補足日時:2018/01/19 17:11
  • 質問に貼ってあるプログラムはこれを理解して課題に取り組めと出されたプログラムです。

      補足日時:2018/01/19 17:15

A 回答 (10件)

返事を付けてくださってありがとうございました。


どうなさったのか、気にしていましたから。
間に合わなかったら、悪いことをしたと思っていたからです。

>→大学の情報処理演習という授業です
実は、ここが気になってました。私にもう一度チャンスがあれば、こういうことを勉強してみようか、なんて思いました。放送大学で2科目はやってみましたが、実際、なかなか難しいです。
インストラクター講座の時に、もっと単純な、うるう年かどうかの判定のフローチャートを書けという問題でさえ、みんな四苦八苦してしまいます。

私も勉強してみようと思いました。
なお、ここで解答を得られる人ばかりではないので、ラッキーだったかもしれません。
    • good
    • 0

そろそろ解答を書いておきます。



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に再び最初のようにシフトされ、このサイクルは繰り返される。
    • good
    • 1
この回答へのお礼

お礼遅くなって申し訳ありません。
回答本当にありがとうございます!
とてもとても助かりました!感謝しています!全くといっていいほどプログラムがわからなかったのですが、
WindFallerさんとtaisukeさんのお力のおかげで理解することができました!難しいですが、理解できれば面白いですね!
WindFallerさんの訳と自分で訳したやつはほとんど同じでした!

ところで、この授業は、なんの授業でしょうか?

→大学の情報処理演習という授業です

課題の提出期限はあと2日ほどあります!余裕をもって取り組むことが出来ました!ありがとうございます!!!

taisukeさんもWindFallerさんも丁寧に、とてもわかりやすく教えて下さり本当にありがとうございました!
本当に感謝です!
これからも教えて下さったことを活かして授業を頑張っていこうと思います!
最後にもう一度、ありがとう!

お礼日時:2018/01/26 07:38

追伸、全文の復号化終わりました。



暗号文の下から二段目のTYODT4の後は、私のモニターでは、点(カンマ?)がいくつか見えません。
正解は5個です。

この問題を出した人は、わざとではないでしょうか。

繰り返し、マクロで探しなさい、ということでしょう。
(ヒントには、そう書いてはありましたが、そんなのは余裕がある人だけです。)

ところで、この授業は、何の授業でしょうか?
今、1月だから、この解答提出が、学期末になるのでしょうか?

ちなみに、英文は、そのままでも読めると思いますが、
Micrsoft の翻訳サイトは、とてもよいです。
画像では、カンマとピリオドがはっきりしませんので、文章的に直したほうが良い場合があります。

翻訳サイトは category を選定できますが、一般的に、general で、文章がこなれるようです。
https://www.bing.com/translator?category=general …
    • good
    • 1

ちょっと、元のコードの説明をしておきますね。


擬似乱数を知ったのは、もう昔なので、現役の方のほうがはっきりしていると思います。

大事なのは、ここですよね。
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さんでした。お詫びと訂正いたします。
    • good
    • 1

#5のtaisuk555さんの


>Keyは19114で合っていますか?
先を越されてしまいました。というか、一旦寝ていましたから。

今、試してみたところ こちらのコードでも、Keyは、19114 (98番目)ではないかと思います。

一応、暗号解読プログラムはできましたが、何か、とことん、私は、ヒントは読み違えるし、早合点と、ミスの連発していました。こういう時は、慎重にしたほうがよいと思いました。明日、また検証してみます。

>これを1つ1つプログラムに入れて実行し、英文になっているのを見つけるしか方法はないのでしょうか。

そのとおりです。167個全部を見なくてはなりません。

それと、これは、やはりシーザー暗号の変形ですね。
それさえわかれば、後は、答えは自ずと出るはずです。
    • good
    • 1

プログラムの内容はあまり理解していませんとの事ですので、


#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
    • good
    • 1
この回答へのお礼

お礼遅くなって申し訳ありません。
とても詳しくありがとうございます!
Keyは19114であっていました!
なんとなくですが、プログラムを理解することができました。理解できれば面白いですね!これからも頑張っていこうと思います!ありがとうございました!

お礼日時:2018/01/26 07:24

#2の回答者です。



一応、暗号のプログラムはやったことがありますが、今時、VBAでも、そのようなコードは書きません。問題は、Key を見つけることですが、要するに、この問題の趣旨は、復号化プログラム(解読プログラム)を作れということですね。

そのヒントを読むまで、私は、勘違いしていた部分があります。

>解読した時に@となるところを空白にするにはどうすればよいでしょうか?

実は、これがネックだったのです。空白が@ を更に、乱数で一定の数値にならなかったからです。もしかしたら、それってワザと混乱させるために作られたものでは?
他にも勘違いしていた部分がありますが、それは、なんとなく、ミスしているようなコードだからです。

空白を入れるなら、64 ->@ ですから、そのまま、32を入れればよいだけです。
' If x = 32 Then x = 64
この行を削除するか、コメントアウトしてください。

後は、もう少し時間ください。

それと、最初からこれだけの情報を与えてくれていたら、もう少し話の展開が早かったと思います。
    • good
    • 1

プログラムのどの部分が分からないのでしょうか?


プログラム自体はそれほど難しい事をしていないので、
#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さえ分かれば、元に戻す事ができます。

そういう質問でなければ、具体的にどの部分が分からないのか
書いた方が、回答者も回答しやすいですよ。
    • good
    • 1
この回答へのお礼

そうですね、質問の仕方が良くなかったです。
なるほど、正しいkeyを見つければ乱数を初期化する事ができて暗号を解読する事ができるのですね!ありがとうございます。

お礼日時:2018/01/19 16:57

それは、個人が作ったものでしょうか?


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)ができるはずです。これは、その反対の復号化コードがなければ意味がありません。


インターネットで同様のものを探しましたが、見つかりません。
    • good
    • 1
この回答へのお礼

これは授業の課題でヒントとしてでたものです。このプログラムを理解して課題に取り組めとのことでした。
復号化プログラムとやらは出されていません。どのような課題なのか上の方に貼っておきます。
回答ありがとうございました。

お礼日時:2018/01/19 17:02

指定したキーナンバーで解ける乱数式暗号を作成しているのだと思いますよ。

    • good
    • 0

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