128位十六进制密钥

时间:2014-08-13 14:18:44

标签: vb.net visual-studio-2010

所以我的教授给了我一个挑战,建立一个可以打破他的特殊公式的解码器。它被描述为长度为32个字符,输入时为字母数字数字,然后是"它有一个系统......前106位必须是50%1&s;其余为0' s,剩余的22位基本上是先前位的散列,因此可以检查密钥......"是他的确切话语。对我来说就像一个带有扭曲的128位加密。我找到了下面但我需要VB2010或VS2010,这就是说php。

<?php
function string_random($characters, $length)
{
$string = '';
for ($max = mb_strlen($characters) - 1, $i = 0; $i < $length; ++ $i)
    {
    $string .= mb_substr($characters, mt_rand(0, $max), 1);
    }
return $string;
}

// 128 bits is 16 bytes; 2 hex digits to represent each byte
$random_128_bit_hex = string_random('0123456789abcdef', 32);
// $random_128_bit_hex might be: '4374e7bb02ae5d5bc6d0d85af78aa2ce'

那会有用吗?还是需要转换?请帮忙。哦,谢谢你:) 我没有承诺额外的功劳,但不管怎样,我都想让他感到惊讶。

1 个答案:

答案 0 :(得分:0)

所以前106位是26个字符,27位是上半部分。

首先编码0和1的编号,同时构建字符串,以便密切关注数字。一个想法是建立这样的地图:

0 = 0000 = -4
1 = 0001 = -2
2 = 0010 = -2
3 = 0011 = 0
4 = -2
5 = 0
6 = 0
7 = +2
8 = -2
9 = 0
a = 0
b = +2
c = 0
d = +2
e = +2 
f = +4

然后,每次提取新的随机数时,都要检查与其关联的数字并将其添加到变量

balanceOfOneAndZero

当你击中第27个角色时,你的目标是达到balanceOfOneAndZero = 0。

要做到这一点,你需要一个控制功能,它需要当前的balanceOfOneAndZero,建议的字符proposedChar和当前字符串lenght currLenght。

最好将问题分成两部分。首先是达到序列的第26个字符,其中balanceOfOneAndZero介于-2和2之间。任何其他值都是不可接受的,因为你的第27个字符最多可以有两个1或两个0来完全平衡前106个字符。

所以你的函数应该做类似的事情(因为我现在还没有IDE,所以我会写一些伪代码)

function checkNextLetter(Dim balanceOfOneAndZero As Integer, Dim proposedChar As Char, 
                         Dim currentLenght as Integer) As Boolean

If( ((26 - currentLenght - 1) * 4 + 2) < MOD(Map.ValueOf(proposedChar) + balanceOfOneAndZero) ) Then 
Return true
Else
Return false
ENd If


End function

此功能基本上检查接受新字符是否仍然可以在第26个字符之前平衡0和1的数量。 因此,每次提出一个新角色时,你的主函数都应该有一个循环,比如

proposedChar = new RandomChar
While (Not checkNextLetter(balanceOfOneAndZero, proposedChar, len(currentString))
proposedChar = new RandomChar
End While
currentString = currentString & proposedChar

直到你击中第26个角色。

比你必须检查balanceOfOneAndZero,如果它是2你添加一个以00开头的字符,如果它是0你可以有10或01,如果它是-2你必须添加一个以11开头的字符。

在此之后我无法帮助你解决剩下的22个角色,因为没有足够的信息。你可以强迫其余的

编辑:

所以蛮力其余的(从你到达第26个角色时开始):

Dim stringa1,stringa2,stringa3,stringa4 As String

If balanceOfOneAndZero = 2 Then
stringa1 = currentString & '0'
stringa2 = currentString & '1'
stringa3 = currentString & '2'
stringa4 = currentString & '3'
ELse If balanceOfOneAndZero = 0 Then
stringa1 = currentString & '4'
stringa2 = currentString & '5'
stringa3 = currentString & '6'
stringa4 = currentString & '7'
Else
stringa1 = currentString & 'c'
stringa2 = currentString & 'd'
stringa3 = currentString & 'e'
stringa4 = currentString & 'f'
End if




Function GenerateAllCombination(ByVal iLenght As Integer)

Dim arrayLista As New List(Of String)()
Dim arraySubLista As New List(Of String)()

If (iLenght > 1) Then 

arraySubLista = GenerateAllCombination(iLenght -1)

for each objString As String in arraySubLista 

    for each ele As String in arrayValori

        arrayLista.add(objString & ele)

    loop

loop


Else

    for each ele As String in arrayValori

        arrayLista.add(ele)

    loop

End If



End Function

现在,如果您使用generateAllCombination,您将拥有一个包含5个字符的所有组合的字符串列表。 现在你只需通过将这些组合与string1连接到string4(string1&amp; combination)等来创建4个列表。

将所有这些结果放在字符串列表中,并且您有100%表示至少有一个字符串会破坏您的教师代码

我忘记了,arrayValori必须是一个列表,所有值都从“0”到“f”