見ての通りフィッシング詐欺のメールです。
拡散希望 「えきねっと」を騙るフィッシングメールが来ました。ドメインは eki-net.eklyout.club です。みなさん、騙されないように!#拡散希望 #フィッシングメール #詐欺
— 鳩でもわかるC# (@THE_RANRAN) November 18, 2022
リンク先が「えきねっと」っぽいですが、サブドメインでドメインはeklyout.clubという無関係なサイトであることは一目瞭然です。さてリンクをクリックするとどうなるのでしょうか?
警告:絶対にクリックしてはいけません。アクセスするだけでウイルスに感染する場合もあります。
アクセスするとアカウントとパスワードを入力するように書かれていたので名前は「左岸 端根」(さぎし はしね)、パスワードは適当に入力。すると次にクレジットカードの番号を入力せよと書かれていました。
このとき適当な番号をいれてOKをクリックしても「正しい番号を入力してください」と表示され、さきに進めません。実はクレジットカードの番号はただの乱数ではなく規則性があります。・・・ということにあとになって知りました。
クレジットカードの番号には規則性がある
クレジットカードの番号は「Luhnアルゴリズム(ルーンアルゴリズム)」に従って生成されています。LuhnはIBMの科学者の名前(ハンス・ピーター・ルーン)です。これによって記入ミスやタイプミスを検出することができます。
ではどのような仕組みになっているのでしょうか?
後ろから偶数の桁数(2桁目、4桁目、6桁目…)の番号を2倍にします。そして2倍にした数字が10を超える場合には9を引く。
そのあとすべての数字を足し算する。
その合計が10の倍数なら正しい番号とする。
たとえば番号が「4483-7106-3585-5754」だったとします。この場合は2倍にするのは先頭から1、3、5、7、9、11、13、15桁です。それ以外はそのまま足します。
(8) + 4 + [7] + 3 + [5] + 1 + (0) + 6 + (6) + 5 + [7] + 5 + [1] + 7 + [1] + 4
()は2倍にした数で、[]は2倍にした結果10を超えたので9を引いた数です。
計算すると70になり、正しい番号になります。
クレジットカード番号チェッカー&ジェネレーターをつくる
ではこのようなアプリをつくってみましょう。デザイナで以下のようなものを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 正しい番号の例 "4483-7106-3585-5754" string str = textBox1.Text; label1.Text = ChechNumber(str); } string ChechNumber(string str) { str = str.Replace("-", ""); // 反転させて奇数番目(iが偶数のもの)は2倍にする List<char> vs = str.Reverse().ToList(); List<int> ints = new List<int>(); for (int i = 0; i < vs.Count; i++) { int a = int.Parse(vs[i].ToString()); if (i % 2 == 0) ints.Add(a); else { a *= 2; if (a < 10) ints.Add(a); else ints.Add(a - 9); } } // 合計が10で割り切れれば正しい番号 int sum = ints.Sum(); if (sum % 10 == 0) return $"{sum}:正しい番号です"; else return $"{sum}:不正番号です"; } } |
ついでにダミーの番号をつくるコードも書いてみました。
こんなものをつくってどうしようというのでしょうか? 要するにネタです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class Form1 : Form { private void button2_Click(object sender, EventArgs e) { Random random = new Random(); List<int> ints1 = new List<int>(); for (int i = 0; i < 16 - 1; i++) { if (i == 0) { ints1.Add(4); // Visaカードは最初は「4」の16桁 continue; } ints1.Add(random.Next(10)); // 2桁目から15桁までは0~9の適当な数にする } // 全体を10の倍数にするために最後の桁を調整する List<int> ints2 = new List<int>(); for (int i = 0; i < ints1.Count; i++) { int a = ints1[i]; if (i % 2 != 0) ints2.Add(a); else { a *= 2; if (a < 10) ints2.Add(a); else ints2.Add(a - 9); } } // missingValue が全体を10の倍数にするために不足している数である int missingValue = 10 - (ints2.Sum() % 10); if (missingValue == 10) missingValue = 0; string ret = ""; foreach (int i in ints1) ret += i.ToString(); ret += missingValue.ToString(); // 見やすくするため 4桁ずつ区切る ret = ret.Insert(12, "-"); ret = ret.Insert(8, "-"); ret = ret.Insert(4, "-"); textBox1.Text = ret; // 念のためチェックしてみる label1.Text = ChechNumber(ret); } } |