VB.NET实现DESFire ISO14443A CRC16

    Public Shared Function CRC16_ISO14443A(ByVal InputBytes() As Byte) As Byte()
        If InputBytes Is Nothing OrElse InputBytes.Length < 1 Then
            Return Nothing
        End If

        Dim CRC As UShort = &H6363US  'ISO14443A的CRC16,寄存器初始值为0xC6C6,逆序为0x6363。最后的US表示数据类型为UShort
        Dim Polynomial As UShort = &H8408US  'ISO14443A的CRC16,多项式为X16+X12+X5+1(1 0001 0000 0010 0001),即0x1021,逆序为0x8408
        Dim i, j As Integer
        Dim uCRC(1) As Byte

        For i = 0 To InputBytes.Length - 1
            CRC = CRC Xor InputBytes(i)
            For j = 0 To 7
                If (CRC And 1) Then
                    CRC = (CRC >> 1) Xor Polynomial
                Else
                    CRC = CRC >> 1
                End If
            Next
        Next

        'CRC = CUShort((CRC << 8) Xor ((CRC >> 8) And &HFF))
        'DESFire在APDU中使用的CRC,低字节在前。而BitConverter转换后也是低字节在前,因此无需刻意转换字节顺序。
        uCRC = BitConverter.GetBytes(CRC)

        Return uCRC
    End Function

DESFire使用ISO14443A的CRC16算法(也称为CRC_A算法、CRC16_A算法)。

基本参数是:

宽度:16位(16 bits);

多项式:X16+X12+X5+1(0x1021,逆序0x8408);

寄存器初始值:0xC6C6(逆序0x6363);

输出异或(XOR):0x0000;

输入输出reflect。

测试:

输入:0x00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

输出:0x77 F5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值