insite2012 писал(а):имеются ли в VB методы для просчета CRC или необходимо реализовать все это самому?
insite2012 писал(а):переборщика по подбору значений, при которых просчитанная и реальная CRC файла совпадут.
insite2012 писал(а):А что значит "реверснуть алгоритм"?
insite2012 писал(а):Если не сложно, можно пару ссылок на примеры для VB.NET?)
pronto писал(а):Можно у тех.поддержки производителя попытаться выведать алгоритм CRC или его название (Modbus, CCITT и др.)... Это не должно быть большим секретом.
Вычисление CRC некоторыми распространёнными алгоритмами — это для самопроверки...
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim CRC As CRC16 = New CRC16(&H0)
Dim List As New ArrayList
Dim InData() As Byte = Nothing
Dim Dialog As New OpenFileDialog
Dialog.FileName = Nothing
Dialog.Filter = "eep files(*.eep)|*.eep|bin files(*.bin)|*.bin"
Dim CRC_My As String = ""
If Dialog.ShowDialog = DialogResult.OK Then
List.AddRange(My.Computer.FileSystem.ReadAllBytes(Dialog.FileName))
ReDim InData(List.Count - 1)
InData = List.ToArray(GetType(Byte))
CRC_My = CRC.ComputeCheckSumString(InData)
MsgBox("Контрольная сумма: " & CRC_My)
End If
End Sub
End Class
Public Class CRC16
Private Const Poly As UInt16 = &H8005
Dim Table(255) As UInt16
Dim intValue As UInt16 = 0
Public Function ComputeCheckSumString(ByVal Bytes() As Byte) As String
Dim CRC As UInt16 = Me.intValue
For i As Integer = 0 To Bytes.Length - 1
CRC = CUInt((CRC << 8) Xor Table(((CRC >> 8) Xor (&HFF And Bytes(i)))))
Next
Return CRC.ToString("X2")
End Function
Public Sub New(ByVal InitialValue As UInteger)
Me.intValue = CUInt(InitialValue)
Dim temp, a As UInt16
For i As Integer = 0 To Table.Length - 1
temp = 0
a = CUInt(i << 8)
For j As Integer = 0 To 7
If ((temp Xor a) And &H8000) <> 0 Then
temp = CUInt((temp << 1) Xor Poly)
Else
temp <<= 1
End If
a <<= 1
Next
Table(i) = temp
Next
End Sub
End Class
insite2012 писал(а):Вопрос-что это за таблица значений, я так и не совсем понял ее назначение. Все-таки математических знаний не хватает, думаю, что когда-то изучал, уже подзабыл.
insite2012 писал(а):Есть ли возможность его реверснуть? То есть, если сейчас код высчитывает на основе полинома, начального значения и входной информации CRC, возможно ли сделать, чтобы код на основе уже известного значения CRC, начального значения и входных данных высчитал используемый полином. Это возможно?
FireFenix писал(а):Тут математика не причём, это ваше не знание алгоритма и способов возможных оптимизаций
Очевидно, что возможно
Private Function ComputeCRC16(ByVal Bytes() As Byte) As String
Dim Poly As UInt16 = &H8005
Dim CRC As UInteger
Dim Temp As UInteger
CRC = &HFFFF
For i As Integer = 0 To Bytes.Length - 1
Temp = Bytes(i) * &H100
CRC = CRC Xor Temp
For j As Integer = 0 To 7
If (CRC And &H8000) > 0 Then
CRC = ((CRC * 2) Xor Poly) And &HFFFF
Else
CRC = (CRC * 2) And &HFFFF
End If
Next
Next
CRC = CRC Xor &HFFFF
Return CRC.ToString("X2")
End Function
insite2012 писал(а):логическое сложение
Qwertiy писал(а):Ничего себе! Назвать побитовый and логическим сложением!!!
insite2012 писал(а):Подскажите, в чем ошибаюсь, буду постигать науку постепенно)
insite2012 писал(а):And &HFFFF
insite2012 писал(а):And &H8000
insite2012 писал(а):А зачем умножение на 2 стоит?
insite2012 писал(а): Ну или сначала написать полный код просчета, без таблицы, и уже потом его реверсить в обратную сторону.
insite2012 писал(а):Ну, с помощью MSDN удалось написать более-менее приемлемую функцию просчета CRC, без использования таблицы. Правда, не все понятно в алгоритме, потому есть вопросы.
insite2012 писал(а):Ну и уже по будущему реверсингу
pronto писал(а):Дело может быть не только в начальном полиноме и/или таблице начальных значений, но и в самом алгоритме расчёта. Поэтому нужно реверсить или брутить...
insite2012 писал(а):Можно написать... Еще как можно, и не понимать, как он работает)
insite2012 писал(а):А на форум обращаюсь потому, что знаний (именно по программированию) - почти никаких, кроме того, что вычитал в учебниках. Взгляните на дату регистрации. Это как раз тот момент, когда я и занялся написанием программ.
insite2012 писал(а):Для меня сейчас как раз такой момент-учусь, что непонятно-спрашиваю.
insite2012 писал(а):Уверяю Вас, ув. FireFenix, есть области, в которых наше положение диаметрально противоположно - мне там все понятно, а Вам это будет очень сложно
insite2012 писал(а):Если не сложно, подскажите, направьте на путь, как добиться поставленной цели и сделать обратную операцию - просчет полинома на основе имеющейся КС...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85