起因

某些LJ网站/软件/游戏,需要你实名认证。
随便编一个,又告诉你不对。这让某些未成年人很是苦恼。
于是,我亲手奉上身份证的实名绕过代码。

这只对部分程序有效。

思路

首先,这些程序舍不得花钱,于是没有对接公安权威数据库(或者说,并不是没钱,而是安全问题)。但是他们使用校验码的方法核对,造成他们真能识别真伪的假象。

经过

身份证校验码的算法:ISO 7064:1983.MOD 11-2
网上也有好多的介绍,我直接借(fu)鉴(zhi)一篇过来就好

假设某一17位数字是
17位数字       1     2     3     4     5     6     7     8     9     0     1     2     3     4     5     6     7

加权因子 7     9     10    5     8     4     2     1     6     3     7     9     10    5     8     4     2

计算17位数字各位数字与对应的加权因子的乘积的和S:1×7+2×9+3×10+4×5+5×8+6×4+7×2+8×1+9×6+0×3+1×7+2×9+3×10+4×5+5×8+6×4+7×2=368;

计算S÷11的余数T:368 mod 11=5;

((  余数0-10对应校验码为[1, 0, X , 9, 8, 7, 6, 5, 4, 3, 2],算法如下 ))

计算(12-T)÷11的余数R,如果R=10,校验码为字母“X”;如果R≠10,校验码为数字“R”:(12-5)mod 11=7。

该17位数字的校验码就是7,聚合在一为123456789012345677。

原文链接:https://blog.csdn.net/n289950578/java/article/details/22287389
咋样,晕不晕?

代码

使用PHP实现

<?php
function iso7064($vString)
{
// ISO 7064:1983.MOD 11-2
// by weblog.52msr.cn
$wi = array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);
$hash_map = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$i_size = strlen($vString);
$bModify = '?' == substr($vString, -1);
$i_size1 = $bModify ? $i_size : $i_size + 1;
for ($i = 1; $i <= $i_size; $i++) { 
$i1 = $vString[$i - 1] * 1;
$w1 = $wi[($i_size1 - $i) % 10];
$sigma += ($i1 * $w1) % 11; 
}
if($bModify) return str_replace('?', $hash_map[($sigma % 11)], $vString);
else return $hash_map[($sigma % 11)];
}
$s = $_GET['seventeen'];
echo iso7064($s);

食用方法

另存为api.php(当然其他的都行,我用api.php演示)
你的域名/api.php?seventeen=身份证前7位
现在,你就能随便捏造了。
输出结果:最后一位。

结果

体验:http://send.s-gew.com/test/index.php?seventeen=你的身份证前17位
誓死不加后门。
seventeen:17位。

附加代码

还想要更牛?
可以,我们有另一套解决方案。
加上type,更加高大上!

<?php
function iso7064($vString)
{
// ISO 7064:1983.MOD 11-2
// by weblog.52msr.cn
$wi = array(1, 2, 4, 8, 5, 10, 9, 7, 3, 6);
$hash_map = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
$i_size = strlen($vString);
$bModify = '?' == substr($vString, -1);
$i_size1 = $bModify ? $i_size : $i_size + 1;
for ($i = 1; $i <= $i_size; $i++) { 
$i1 = $vString[$i - 1] * 1;
$w1 = $wi[($i_size1 - $i) % 10];
$sigma += ($i1 * $w1) % 11; 
}
if($bModify) return str_replace('?', $hash_map[($sigma % 11)], $vString);
else return $hash_map[($sigma % 11)];
}

$s = $_GET['seventeen'];

if ($_GET['type'] == "all"){
        echo iso7064("$s?");
}else{
echo iso7064($s);
}

现在,方法就变成了:
你的域名/api.php?type=all&seventeen=身份证前7位
就会输出你的前17位和后一位的加起来的结果。
举个例子:
42222222222222223
这个是17位,当你使用我们的API,会输出:
422222222222222235
如果没有type或者type不等于all
会输出5

Last modification:June 23rd, 2020 at 11:43 am
如果这篇文章帮到了你,就打赏一下吧(只支持QQ)