1 つのアイデアは、一意の当選コードをデータベースに入力し、当選コードを 1 つ取り出してマークを付け、当選コードを伝えます (受信時に覚えておいてください)。賞品必須): XXXXX
次に、ユーザーは XXXXXXXXXXXXXXX を入力し、簡単な認証後に賞品を受け取ることができます。
このような機能を使ったことはありますか、あるいは開発してみたいと思ったことはありますか?
1 つのアイデアは、一意の勝利コードのバッチをデータベースに入力し、勝利したら 1 つを取り出してマークを付け、勝利コードを伝えるというものです。
ユーザー。
しかし、これには最初に勝利コードのバッチをデータベースに入力する必要があります。他の方法はありますか?
例: 200807151054281502895e585d7e4b529e、検証のためにデータベースにクエリを実行せずに当選を確認することは可能ですか?
コードは有効ですか (偽造されていませんか)?
アイデアがあるので、よろしければ聞いてください:)
たとえば、この当選コード: 200807151054281502895e585d7e4b529e
3つの部分から構成されています
20080715105428 1502 895e585d7e4b529e
20080715105428 は年、月、日、時、分、秒です YYYYMMDDhhmmss
1502 は、最初の部分の重複を防ぐための 4 桁の乱数です。
895e585d7e4b529e 最初の 2 つの部分 + PrivateKey の MD5 16 ビット値
一言で言えば、当選コードの最初の 18 桁と最後の 16 桁は関連しています。
このようにして、他の人があなたの PrivateKey を推測できない限り、勝利コードを偽造することはできません。
欠点は、成功コードが少し長いことです:(
コードは次のとおりです。
getkey() は固有の勝利コードを返します
ckkey は、当選コードに賞金があるかどうかを検証します。
次のようにコードをコピーします。
<%
プライベート定数 BITS_TO_A_BYTE = 8
プライベート定数 BYTES_TO_A_WORD = 4
プライベート定数 BITS_TO_A_WORD = 32
プライベート m_lOnBits(30)
プライベート m_l2Power(30)
プライベート関数 LShift(lValue, iShiftBits)
iShiftBits = 0 の場合
LShift = lValue
終了関数
ElseIf iShiftBits = 31 then
lValue と 1 の場合
LShift = &H80000000
それ以外
Lシフト = 0
終了の場合
終了関数
ElseIf iShiftBits < 0 または iShiftBits > 31 then
エラーレイズ6
終了の場合
If (lValue および m_l2Power(31 - iShiftBits)) then
LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) または &H80000000
それ以外
LShift = ((lValue および m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
終了の場合
終了機能
プライベート関数 RShift(lValue, iShiftBits)
iShiftBits = 0 の場合
RShift = lValue
終了関数
ElseIf iShiftBits = 31 then
lValue と &H80000000 の場合
Rシフト = 1
それ以外
Rシフト = 0
終了の場合
終了関数
ElseIf iShiftBits < 0 または iShiftBits > 31 then
エラーレイズ6
終了の場合
RShift = (lValue および &H7FFFFFFE) / m_l2Power(iShiftBits)
If (lValue および &H80000000) then
RShift = (RShift または (&H40000000 / m_l2Power(iShiftBits - 1)))
終了の場合
終了機能
プライベート関数 RotateLeft(lValue, iShiftBits)
RotateLeft = LShift(lValue, iShiftBits) または RShift(lValue, (32 - iShiftBits))
終了機能
プライベート関数 AddUnsigned(lX, lY)
×4
y4
x8
y8
薄暗い結果
lX8 = lX および &H80000000
lY8 = ly および &H80000000
lX4 = lX と &H40000000
lY4 = ly および &H40000000
lResult = (lX と &H3FFFFFFF) + (lY と &H3FFFFFFF)
lX4 と lY4 の場合
lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
それ以外の場合、lX4 または lY4 の場合
lResult と &H40000000 の場合
lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
それ以外
lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
終了の場合
それ以外
lResult = lResult Xor lX8 Xor lY8
終了の場合
AddUnsigned = lResult
終了機能
プライベート関数 md5_F(x, y, z)
md5_F = (x と y) または ((x ではない) と z)
終了機能
プライベート関数 md5_G(x, y, z)
md5_G = (x と z) または (y と (z ではない))
終了機能
プライベート関数 md5_H(x, y, z)
md5_H = (x Xor y Xor z)
終了機能
プライベート関数 md5_I(x, y, z)
md5_I = (y Xor (x Or (Not z)))
終了機能
プライベートサブ md5_FF(a、b、c、d、x、s、ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
a = 左回転(a, s)
a = AddUnsigned(a, b)
エンドサブ
プライベートサブ md5_GG(a、b、c、d、x、s、ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
a = 左回転(a, s)
a = AddUnsigned(a, b)
エンドサブ
プライベートサブ md5_HH(a、b、c、d、x、s、ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
a = 左回転(a, s)
a = AddUnsigned(a, b)
エンドサブ
プライベート サブ md5_II(a、b、c、d、x、s、ac)
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
a = 左回転(a, s)
a = AddUnsigned(a, b)
エンドサブ
プライベート関数 ConvertToWordArray(sMessage)
Dim lMessageLength
薄暗い lNumberOfWords
Dim lWordArray()
Dim lBytePosition
ディム lByteCount
薄暗い lWordCount
定数 MODULUS_BITS = 512
定数 CONGRUENT_BITS = 448
lMessageLength = Len(sMessage)
lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD)
ReDim lWordArray(lNumberOfWords - 1)
lBytePosition = 0
lバイト数 = 0
lByteCount >= lMessageLength まで実行します
lWordCount = lByteCount / BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) または LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
lバイトカウント = lバイトカウント + 1
ループ
lWordCount = lByteCount / BYTES_TO_A_WORD
lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
lWordArray(lWordCount) = lWordArray(lWordCount) または LShift(&H80, lBytePosition)
lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
ConvertToWordArray = lWordArray
終了機能
プライベート関数 WordToHex(lValue)
ディムlバイト
ディム・カウント
lCount = 0 ~ 3 の場合
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) および m_lOnBits(BITS_TO_A_BYTE - 1)
WordToHex = WordToHex & Right(0 & Hex(lByte), 2)
次
終了機能
パブリック関数 MD5(sMessage)
m_lOnBits(0) = CLng(1)
m_lOnBits(1) = CLng(3)
m_lOnBits(2) = CLng(7)
m_lOnBits(3) = CLng(15)
m_lOnBits(4) = CLng(31)
m_lOnBits(5) = CLng(63)
m_lOnBits(6) = CLng(127)
m_lOnBits(7) = CLng(255)
m_lOnBits(8) = CLng(511)
m_lOnBits(9) = CLng(1023)
m_lOnBits(10) = CLng(2047)
m_lOnBits(11) = CLng(4095)
m_lOnBits(12) = CLng(8191)
m_lOnBits(13) = CLng(16383)
m_lOnBits(14) = CLng(32767)
m_lOnBits(15) = CLng(65535)
m_lOnBits(16) = CLng(131071)
m_lOnBits(17) = CLng(262143)
m_lOnBits(18) = CLng(524287)
m_lOnBits(19) = CLng(1048575)
m_lOnBits(20) = CLng(2097151)
m_lOnBits(21) = CLng(4194303)
m_lOnBits(22) = CLng(8388607)
m_lOnBits(23) = CLng(16777215)
m_lOnBits(24) = CLng(33554431)
m_lOnBits(25) = CLng(67108863)
m_lOnBits(26) = CLng(134217727)
m_lOnBits(27) = CLng(268435455)
m_lOnBits(28) = CLng(536870911)
m_lOnBits(29) = CLng(1073741823)
m_lOnBits(30) = CLng(2147483647)
m_l2Power(0) = CLng(1)
m_l2Power(1) = CLng(2)
m_l2Power(2) = CLng(4)
m_l2Power(3) = CLng(8)
m_l2Power(4) = CLng(16)
m_l2Power(5) = CLng(32)
m_l2Power(6) = CLng(64)
m_l2Power(7) = CLng(128)
m_l2Power(8) = CLng(256)
m_l2Power(9) = CLng(512)
m_l2Power(10) = CLng(1024)
m_l2Power(11) = CLng(2048)
m_l2Power(12) = CLng(4096)
m_l2Power(13) = CLng(8192)
m_l2Power(14) = CLng(16384)
m_l2Power(15) = CLng(32768)
m_l2Power(16) = CLng(65536)
m_l2Power(17) = CLng(131072)
m_l2Power(18) = CLng(262144)
m_l2Power(19) = CLng(524288)
m_l2Power(20) = CLng(1048576)
m_l2Power(21) = CLng(2097152)
m_l2Power(22) = CLng(4194304)
m_l2Power(23) = CLng(8388608)
m_l2Power(24) = CLng(16777216)
m_l2Power(25) = CLng(33554432)
m_l2Power(26) = CLng(67108864)
m_l2Power(27) = CLng(134217728)
m_l2Power(28) = CLng(268435456)
m_l2Power(29) = CLng(536870912)
m_l2Power(30) = CLng(1073741824)
ディム×
ディムk
ディムAA
ディムBB
ディムCC
ディムDD
ディム a
ディムb
ディムc
ディム・ディ
定数S11 = 7
定数 S12 = 12
定数 S13 = 17
定数S14 = 22
定数S21 = 5
定数 S22 = 9
定数 S23 = 14
定数S24 = 20
定数 S31 = 4
定数 S32 = 11
定数 S33 = 16
定数S34 = 23
定数 S41 = 6
定数S42 = 10
定数 S43 = 15
定数 S44 = 21
x = ConvertToWordArray(sMessage)
a = &H67452301
b = &HEFCDAB89
c = &H98BADCFE
d = &H10325476
k = 0 の場合、UBound(x) へ ステップ 16
AA = a
BB = b
CC = c
DD = d
md5_FF a、b、c、d、x(k + 0)、S11、&HD76AA478
md5_FF d、a、b、c、x(k + 1)、S12、&HE8C7B756
md5_FF c、d、a、b、x(k + 2)、S13、&H242070DB
md5_FF b、c、d、a、x(k + 3)、S14、&HC1BDCEEE
md5_FF a、b、c、d、x(k + 4)、S11、&HF57C0FAF
md5_FF d、a、b、c、x(k + 5)、S12、&H4787C62A
md5_FF c、d、a、b、x(k + 6)、S13、&HA8304613
md5_FF b、c、d、a、x(k + 7)、S14、&HFD469501
md5_FF a、b、c、d、x(k + 8)、S11、&H698098D8
md5_FF d、a、b、c、x(k + 9)、S12、&H8B44F7AF
md5_FF c、d、a、b、x(k + 10)、S13、&HFFFF5BB1
md5_FF b、c、d、a、x(k + 11)、S14、&H895CD7BE
md5_FF a、b、c、d、x(k + 12)、S11、&H6B901122
md5_FF d、a、b、c、x(k + 13)、S12、&HFD987193
md5_FF c、d、a、b、x(k + 14)、S13、&HA679438E
md5_FF b、c、d、a、x(k + 15)、S14、&H49B40821
md5_GG a、b、c、d、x(k + 1)、S21、&HF61E2562
md5_GG d、a、b、c、x(k + 6)、S22、&HC040B340
md5_GG c、d、a、b、x(k + 11)、S23、&H265E5A51
md5_GG b、c、d、a、x(k + 0)、S24、&HE9B6C7AA
md5_GG a、b、c、d、x(k + 5)、S21、&HD62F105D
md5_GG d、a、b、c、x(k + 10)、S22、&H2441453
md5_GG c、d、a、b、x(k + 15)、S23、&HD8A1E681
md5_GG b、c、d、a、x(k + 4)、S24、&HE7D3FBC8
md5_GG a、b、c、d、x(k + 9)、S21、&H21E1CDE6
md5_GG d、a、b、c、x(k + 14)、S22、&HC33707D6
md5_GG c、d、a、b、x(k + 3)、S23、&HF4D50D87
md5_GG b、c、d、a、x(k + 8)、S24、&H455A14ED
md5_GG a、b、c、d、x(k + 13)、S21、&HA9E3E905
md5_GG d、a、b、c、x(k + 2)、S22、&HFCEFA3F8
md5_GG c、d、a、b、x(k + 7)、S23、&H676F02D9
md5_GG b、c、d、a、x(k + 12)、S24、&H8D2A4C8A
md5_HH a、b、c、d、x(k + 5)、S31、&HFFFA3942
md5_HH d、a、b、c、x(k + 8)、S32、&H8771F681
md5_HH c、d、a、b、x(k + 11)、S33、&H6D9D6122
md5_HH b、c、d、a、x(k + 14)、S34、&HFDE5380C
md5_HH a、b、c、d、x(k + 1)、S31、&HA4BEEA44
md5_HH d、a、b、c、x(k + 4)、S32、&H4BDECFA9
md5_HH c、d、a、b、x(k + 7)、S33、&HF6BB4B60
md5_HH b、c、d、a、x(k + 10)、S34、&HBEBFBC70
md5_HH a、b、c、d、x(k + 13)、S31、&H289B7EC6
md5_HH d、a、b、c、x(k + 0)、S32、&HEAA127FA
md5_HH c、d、a、b、x(k + 3)、S33、&HD4EF3085
md5_HH b、c、d、a、x(k + 6)、S34、&H4881D05
md5_HH a、b、c、d、x(k + 9)、S31、&HD9D4D039
md5_HH d、a、b、c、x(k + 12)、S32、&HE6DB99E5
md5_HH c、d、a、b、x(k + 15)、S33、&H1FA27CF8
md5_HH b、c、d、a、x(k + 2)、S34、&HC4AC5665
md5_II a、b、c、d、x(k + 0)、S41、&HF4292244
md5_II d、a、b、c、x(k + 7)、S42、&H432AFF97
md5_II c、d、a、b、x(k + 14)、S43、&HAB9423A7
md5_II b、c、d、a、x(k + 5)、S44、&HFC93A039
md5_II a、b、c、d、x(k + 12)、S41、&H655B59C3
md5_II d、a、b、c、x(k + 3)、S42、&H8F0CCC92
md5_II c、d、a、b、x(k + 10)、S43、&HFFEFF47D
md5_II b、c、d、a、x(k + 1)、S44、&H85845DD1
md5_II a、b、c、d、x(k + 8)、S41、&H6FA87E4F
md5_II d、a、b、c、x(k + 15)、S42、&HFE2CE6E0
md5_II c、d、a、b、x(k + 6)、S43、&HA3014314
md5_II b、c、d、a、x(k + 13)、S44、&H4E0811A1
md5_II a、b、c、d、x(k + 4)、S41、&HF7537E82
md5_II d、a、b、c、x(k + 11)、S42、&HBD3AF235
md5_II c、d、a、b、x(k + 2)、S43、&H2AD7D2BB
md5_II b、c、d、a、x(k + 9)、S44、&HEB86D391
a = AddUnsigned(a, AA)
b = AddUnsigned(b, BB)
c = AddUnsigned(c, CC)
d = AddUnsigned(d, DD)
次
'MD5 = UCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)) '32バイト
MD5 = LCase(WordToHex(b) & WordToHex(c)) '16 バイトのデータベース パスワードに合わせてこれを切り取ります :D
終了機能
関数 CFTGetServerDate(d)
Dim strTmp、i年、i月、iDate
i年 = 年(d)
iMonth = 月(d)
iDate = 日(d)
strTmp = CStr(i年)
iMonth < 10 の場合
strTmp = strTmp & 0 & Cstr(iMonth)
それ以外
strTmp = strTmp & Cstr(iMonth)
終了の場合
iDate < 10 の場合
strTmp = strTmp & 0 & Cstr(iDate)
それ以外
strTmp = strTmp & Cstr(iDate)
終了の場合
CFTGetServerDate = strTmp
終了機能
関数 CFTGetServertime(d)
Dim strTmp、i年、i月、iDate
i年 = 時間(d)
iMonth = 分(d)
iDate = 秒(d)
strTmp =
i年 < 10 の場合
strTmp = strTmp & 0 & Cstr(i年)
それ以外
strTmp = strTmp & Cstr(i年)
終了の場合
iMonth < 10 の場合
strTmp = strTmp & 0 & Cstr(iMonth)
それ以外
strTmp = strTmp & Cstr(iMonth)
終了の場合
iDate < 10 の場合
strTmp = strTmp & 0 & Cstr(iDate)
それ以外
strTmp = strTmp & Cstr(iDate)
終了の場合
CFTGetServertime = strTmp
終了機能
関数 GetRnd(最小値,最大値)
ランダム化
GetRnd = Int((最大値 - 最小値 + 1) * Rnd + 最小値)
終了関数
関数 getrnddatenum()
getrnddatenum = CFTGetServerDate(現在) & CFTGetServertime(現在) & GetRnd(1000,9999)
終了関数
「PrivateKey は、できるだけ複雑にするようにしてください。一度使用し始めると変更できません。
ディムキー情報キー
keyinfokey = 51windows.net@1234567890!@#$%^&*()QWERFGHJK
'勝利コードを取得します
関数getkey()
スキー = getrnddatenum()
skey2 = md5(skey & keyinfokey)
getkey = スキー & スキー2
終了関数
' 勝ったコードを検証する
機能キー
strs = s
if len(strs)<> 34 then
ckkey = false
終了関数
終了する場合
datenum = left(strs,18)
md5oldstr = right(strs,16)
md5str = md5(日付番号 & キー情報キー)
lcase(md5str) = lcase(md5oldstr) の場合
ckkey=true
それ以外
ckkey = false
終了する場合
終了関数
%>