标签: check-digit

逆向工程校验位算法

我正在尝试对用于生成校验位的算法进行逆向工程.

数字长8位,最后一位是校验位.我有成千上万的有效数字来测试它.

我尝试过标准的Luhn,Verhoeff和modulo-10算法(对所有可能的权重进行强力检查),但找不到答案!

有可能计算出来吗?有任何想法吗?

以下是有效数字的一些示例:

1002784-5
1000514-7
1001602-8
1001255-2
1001707-1
1003355-5
1005579-1
1004535-0
1004273-1
1001695-9
1004565-9
1000541-9
1001291-1
1005866-1
1004352-7
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢你们 - 遗憾的是我没有访问代码.该号码是一个税号,我需要能够验证该号码是否输入正确.从我的研究看起来大多数国家都使用非常标准的模10型系统.我可以访问大约6万个号码.

我知道问题可能无法解决,更多的是学术上的关注.

algorithm reverse-engineering check-digit

15
推荐指数
1
解决办法
2406
查看次数

单字符签名方案(最小安全性)

注意:我最初将其发布到信息安全,但我开始认为它可能更相关,因为它确实是关于确定我应该如何处理请求而不是保护信息.

情况

系统A:

我有一个A向用户提供请求的系统.此服务器执行某些操作,然后将用户重定向到系统B.在该重定向期间,服务器A可以向用户提供32个字符的字母数字信息串以传递给系统B.需要31个字符的信息,但其中一个可用作校验和.此字符串可以或多或少地被视为请求ID.

系统B:

当系统B接收来自用户的请求时,它可以验证该请求(以及ID-等字符串)是有效的通过解析31个字符的字符串,查询数据库,再跟系统A.本系统可以绝对肯定验证请求有效并且没有被篡改,但它的计算成本非常高.

攻击者:

该系统可能会看到许多欺骗ID的尝试.这可以通过以后的检查进行过滤,因此我并不担心单个角色完全签署ID,我确实希望避免花费更多资源来处理这些请求.

我需要的

我正在寻找一个校验和/签名方案,它可以用一个字符让我很好地了解请求是否应该继续进行验证过程,或者是否应该立即将其丢弃为无效.如果一条消息被丢弃,我需要100%确定它是无效的,但如果我保留无效的消息也没关系.我相信理想的解决方案意味着保留1/62无效请求(攻击者必须猜测检查字符),但作为最小解决方案,丢弃所有无效请求的一半就足够了.

我试过的

我看过使用卢恩算法(这是用于信用卡相同),但我想能够使用一键生成的字符,使其更难以攻击者欺骗校验.

作为创建签名方案的第一次尝试,我用一个31字节的密钥对31字节的id进行按位,对结果字节求和,转换为十进制并将数字加在一起直到它小于62,然后映射它到集合中的字符[a-bA-Z0-9](下面的伪代码).问题是虽然我很确定这不会丢弃任何有效的请求,但我不确定如何确定这将通过无效ID的频率,或者是否可以使用最终值检索密钥.

Set alphabet to (byte[]) "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
Set keystring to "aLaklj14sdLK87kxcvalskj7asfrq01";

Create empty byte[] key;
FOR each letter in keystring
  Push (index of letter in alphabet) to key;

Create empty byte[] step1;

FOR each (r, k) in (request, key)
  Push r XOR s to step1;

Set step2 to …
Run Code Online (Sandbox Code Playgroud)

javascript checksum signing check-digit node.js

13
推荐指数
1
解决办法
164
查看次数

生成Luhn校验和

验证Luhn校验和有很多实现,但很少用于生成它们.我遇到过这个,但是在我的测试中它发现它是错误的,我不理解delta变量背后的逻辑.

我已经创建了这个应该生成Luhn校验和的函数,但由于某些原因我还没有理解生成的校验和在一半时间内是无效的.

function Luhn($number, $iterations = 1)
{
    while ($iterations-- >= 1)
    {
        $stack = 0;
        $parity = strlen($number) % 2;
        $number = str_split($number, 1);

        foreach ($number as $key => $value)
        {
            if ($key % 2 == $parity)
            {
                $value *= 2;

                if ($value > 9)
                {
                    $value -= 9;
                }
            }

            $stack += $value;
        }

        $stack = 10 - $stack % 10;

        if ($stack == 10)
        {
            $stack = 0;
        }

        $number[] = $stack;
    }

    return implode('', …
Run Code Online (Sandbox Code Playgroud)

php algorithm checksum check-digit luhn

12
推荐指数
1
解决办法
1万
查看次数

将Damm算法扩展到base-32

我想使用Damm算法为具有32个字符的字母表生成校验位.算法本身很容易应用于任何基础(2或6除外).难点是必要的查找表,它必须是一个完全反对称的拟群,在主对角线下面有一个字符(通常为0).

维基百科页面给出了基地10台,以及Python实现提供了一个表16为基的,但我还没有找到一个基地-32的例子.有没有人有一个合适的基地32表?

algorithm check-digit

11
推荐指数
1
解决办法
1763
查看次数

Java或C ++中的API,用于读取MRZ旅行证件(护照)代码

我正在寻找Java或C ++中的API来读取MRZ并解码旅行证件(护照)中的MRZ代码。

有关MRZ的更多信息,请访问http://www.highprogrammer.com/alan/numbers/mrp.html。以前有人使用API​​做到过吗?

c++ java machine-learning check-digit

6
推荐指数
1
解决办法
8342
查看次数

Verhoeff 算法的正确置换循环

我正在为校验位方案实现 Verhoeff 算法,但在网络资源中似乎存在一些分歧,即哪个置换周期应构成置换表的基础。

维基百科使用:(36)(01589427)

显然,数值Recipies使用不同的周期和本书的用途:(0)(14)(23)(56789),从1990年的文章通过引用温特斯。它还指出 Verhoeff 使用了维基百科的一个引述。

现在,我的数论有点生疏,但维基百科的循环显然会在 8 次方之后重复,而书的 one 将需要 10,尽管它说 s^8=s。表 2.14(b) 在 2 个循环中还有其他错误,所以无论如何这都是可疑的。

不幸的是,我没有原始文章的副本(并且支付/厌恶出版商仍然要赎金 40 年前的知识),也没有要检查的数字食谱副本(并且我不愿意安装他们偏执引起的复制保护插件以在线查看)。

那么有人知道哪个是正确的吗?他们都正确吗?

algorithm permutation check-digit

5
推荐指数
1
解决办法
1103
查看次数

如何在C#中生成CUSIP校验位

CUSIP是一个9位数的字母数字代码,用于唯一标识财务安全性.

https://en.wikipedia.org/wiki/CUSIP

它们是在1964年发明的,并且考虑到60年代数据传输的可靠性,第9位实际上是用于确认前8个字符有效性的校验位.有时候,即使在今天,您也可能有理由想要验证CUSIP,或者公司或服务公司或服务公司决定只传输8个字符的CUSIP,即使这会破坏校验位的目的.

生成校验位的过程是:

  1. 根据字母表中的序号位置加上9(A = 10,B = 11,... Z = 35)并转换字符*= 36,@ = 37,#= 38,将非数字数字转换为值.

  2. 将每个偶数乘以2

  3. 如果乘法的结果是两位数,则将数字相加.(12 = 1 + 2 = 3)

  4. 获取所有值的总和.

  5. 获取此操作的内含值:(10 - (sum modulo 10))modulo 10.

在C#中获取此值的最佳/最简单方法是什么?

c# algorithm financial check-digit

4
推荐指数
3
解决办法
7586
查看次数

mod 11 校验位与正则表达式

是否可以使用正则表达式语句创建 mod 11 校验位例程?

该数字是一个 10 位数字,

步骤1:A = (第2个数 * 2) + (第3个数 * 4) + (第4个数 * 8) + (第5个数 * 5) + (第6个数 * 10) + (第7个数 * 9) + (第8个数* 7) + (第 9 个数字 * 3))

步骤 2:B = A / 11(忽略余数)

步骤3:C=B*11

步骤 4:D = A - C

步骤 5:11 - D 必须 = 第 10 位数字

regex check-digit

3
推荐指数
2
解决办法
8560
查看次数

校验位算法 Luhn mod N 与简单和

您知道为什么Luhn mod N 算法为了创建校验位而通过将每个偶数放置的字符的值加倍而不是执行所有字符的简单总和来执行求和吗?

用伪代码的话:

给出:

var s = "some string i want to create check digit";
Run Code Online (Sandbox Code Playgroud)

你知道为什么 Luhn mod N 基本上是这样的:

for(i from s.length-1 to 0)
   if(i is even)
      checkdigit += chr2int(s[i]) * 2;
   else
      checkdigit += chr2int(s[i]);
Run Code Online (Sandbox Code Playgroud)

而不是简单地做一个总和

for(i from s.length-1 to 0)
   checkdigit += chr2int(s[i]);
Run Code Online (Sandbox Code Playgroud)

他们仍然可以通过一个mod操作终止,使校验位适合一个字符

return int2chr( chr2int('a') + (checkdigit mod 25) );
Run Code Online (Sandbox Code Playgroud)

作为这个问题的旁注,它可能对 Luhn 算法的图形表示感兴趣,这使得它更容易理解:

在此处输入图片说明

其实这个是原始的 Luhn 算法,甚至不需要使用 MOD 函数。

algorithm checksum check-digit

2
推荐指数
1
解决办法
3778
查看次数

如何在Ruby中完成校验位计算?

我正在尝试在Ruby中为FedEx跟踪号码建立一个校验位计算.

以下是检查位数计算的信息和步骤:

  • 数字位置从右到左标记.
  • 数字1是检查字符.
  • 不使用数字16到22.

脚步:

  1. 从位置2起,加起来的价值甚至编号的位置.
  2. 将第一步的结果乘以三.
  3. 从位置3开始,将奇数位置的值相加.记住 - 位置1是您要计算的校验位.
  4. 将第二步的结果添加到第三步的结果中.
  5. 确定从步骤4中添加到数字时的最小数字,得到10的倍数.这是校验位.

以下是该过程的示例(由FedEx提供): 在此输入图像描述

那么,我如何在Ruby中实现它呢?

ruby algorithm check-digit

1
推荐指数
1
解决办法
1759
查看次数

如何计算IBAN国家校验位?

Wikipedia之后,我正在开发一个Java应用程序,用于计算和验证来自不同国家的IBAN.有些BBAN有一个国家校验位,但我找不到任何关于如何计算它的文档.在哪里可以找到"国家校验位"的算法?我对"iban check digit"不感兴趣,但对国家相关的数字感兴趣.

java iban check-digit

1
推荐指数
1
解决办法
1万
查看次数