PAP认证协议

基本描述:

  Password Authentication Protocol 口令认证协议

  PAP认证过程非常简单,二次握手机制,使用明文格式发送用户名和密码,发起方为被认证方,可以做无限次的尝试(暴力破解),只在链路建立的阶段进行PAP认证,一旦链路建立成功将不再进行认证检测。

rfc参考:rfc2865.txt

使用场景:

  PPPOE拨号和Radius认证环境中。

加密原理:

       加密时将明文按照16字节分块为p1, p2, ..., pi多个小块。

描述
字段 意义
S 共享密钥
RA 128位的请求认证码
p1,p2,...,pi 将明文密码按照16字节分块
c(1),c(2),...,c(i) 加密后的密文串

 

  最终得到的加密密文串是 c(1)+c(2)+...+c(i)连接起来的串。

解密原理:

      解密时将密文按照16字节分块为c(1), c(2), ..., c(i)多个小块。

  最终得到的解密后的明文串是 p1+p2+...+pi连接起来的串。

代码实现:

加密:

#define RAD_PSWDSEG_LEN   16
#define RAD_AUTHCATOR_LEN 16
#define RET_ERROR -1
#define RET_OK 0
std::string peerShareSecret_ = "88----89";
// ---------------------------------------------------------------------------
// int :PasswdXor
//
// Use for encrypt the password attribute.
// ---------------------------------------------------------------------------
//
int PasswdXor(const char *aPasswd, string &aOutPasswd)
{
if (aPasswd == NULL) {
return RET_ERROR;
}
char localPwd[RAD_PASSWORD_LEN+1] = {0};
int pwLen = strlen(aPasswd); // Pad the password. If the length of the passwd isn't multiples of 16, pad it.
if (pwLen > RAD_PASSWORD_LEN) {
return RET_ERROR;
}
char *pwStr = localPwd;
strcpy(localPwd, aPasswd); int n = pwLen - (pwLen/RAD_PSWDSEG_LEN) * RAD_PSWDSEG_LEN;
if (n != 0) {
memset(pwStr+pwLen, 0, RAD_PSWDSEG_LEN - n);
pwLen += 16 - n;
} // Encrypted.
char md5Input[RAD_SECRET_LEN + RAD_AUTHCATOR_LEN] = {0};
char md5Output[RAD_AUTHCATOR_LEN] = {0};
char * inStr = md5Input;
int inlen = peerShareSecret_.length() + RAD_AUTHCATOR_LEN;
strcpy(inStr, peerShareSecret_.c_str());
inStr += peerShareSecret_.length(); memcpy(inStr, (char *)authcator_, RAD_AUTHCATOR_LEN);
int passEncodeLen = pwLen;
for (; pwLen > 0; pwLen -= RAD_PSWDSEG_LEN) {
MD5Calc((unsigned char *)md5Input, inlen, (unsigned char *)md5Output);
int i ;
for (i =0; i<RAD_PSWDSEG_LEN; ++i)
pwStr[i] ^= md5Output[i]; memcpy(inStr, pwStr, RAD_PSWDSEG_LEN);
pwStr += RAD_PSWDSEG_LEN;
} aOutPasswd = EndcodePwd(localPwd, passEncodeLen);
return RET_OK;
}

  

解密:

int PasswdDecodeXor(const char *aPasswd, string &aOutPasswd)
{
if (aPasswd == NULL) {
return RET_ERROR;
}
int pwLen = strlen(aPasswd);
if (pwLen < 32) {
return RET_ERROR;
}
char md5Input[RAD_SECRET_LEN + RAD_AUTHCATOR_LEN] = {0};
char md5Output[RAD_AUTHCATOR_LEN] = {0};
char * inStr = md5Input;
int inlen = peerShareSecret_.length() + RAD_AUTHCATOR_LEN;
strcpy(inStr, peerShareSecret_.c_str());
inStr += peerShareSecret_.length(); memcpy(inStr, (char *)authcator_, RAD_AUTHCATOR_LEN);
aOutPasswd = "";
for(int i = 0; i < pwLen / 32; i++){
char pwStr[RAD_PSWDSEG_LEN + 1] = { 0 };
string hexPass = fromHex(aPasswd+i*32, 32);
memcpy(pwStr, hexPass.data(), 16);
MD5Calc((unsigned char *)md5Input, inlen, (unsigned char *)md5Output);
for (int i = 0; i < RAD_PSWDSEG_LEN; ++i)
pwStr[i] ^= md5Output[i];
pwStr[RAD_PSWDSEG_LEN] = 0x00;
aOutPasswd += pwStr;
if (strlen(pwStr) < RAD_PSWDSEG_LEN) {
break;
} else {
memcpy(inStr, hexPass.data(), 16);
}
}
return RET_OK;
}

Done.

PAP认证方式原理和实现的更多相关文章

  1. Git认证方式https和ssh的原理及比较

    常见的代码托管平台GitHub.GitLab和BitBucket等,基本都会使用Git作为版本控制工具.平台一般都提供两种认证方式https和ssh.了解该过程能够更加自由的配置和使用,本文就来简单聊 ...

  2. oracle 认证方式

    Oracle登录的时候有两种认证方式,一种是“操作系统认证”,一种是“口令文件认证”.1.当采取操作系统认证的时候,在本地用任何用户都可以以sysdba登陆:(默认方式)2.当采取口令文件认证的时候, ...

  3. 比RBAC更好的权限认证方式(Auth类认证)

    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...

  4. Java 实现 SSH 协议的客户端登录认证方式--转载

    背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...

  5. 阿里云API网关(11)API的三种安全认证方式

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  6. oracle登陆认证方式

    转自:http://blog.itpub.net/14359/viewspace-683064/ 案例: 1,发现此时操作系统认证不成功: C:\Users\Administrator.WIN-201 ...

  7. OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法

    OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...

  8. thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)

    thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比 ...

  9. thinkphp 比RBAC更好的权限认证方式(Auth类认证)

    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...

随机推荐

  1. transient关键字的作用

    代码如下: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutpu ...

  2. 如何把select默认的小三角替换成自己的图片

    不同的浏览器默认的select的选项图标是不同的,例如: 在chrome中,是这样的: 未点击时    点击时  在Firefox中是这样的: 未点击时  点击时   在IE9中是这样的: 未点击时  ...

  3. iOS 解决LaunchScreen中图片加载黑屏问题

    iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...

  4. [LeetCode] Fizz Buzz 嘶嘶嗡嗡

    Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...

  5. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  6. ACM模板(持续补完)

    1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

  7. Python小白的发展之路之Python基础(二)

    列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表.元组操作 (1)列表 列表是可变的(mutable)--可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不 ...

  8. 从PHP底层源码去深入理解数组,并用C模拟PHP关联数组(原创)

    PHP是一门入门容易,使用范围广泛的语言,以其灵活性以及web后端开发被很多人熟知,也被很多人戏称“PHP是世界上最好的语言”.本人是一名“忠实”的PHPer,相信用过PHP的程序员都会体会到PHP数 ...

  9. jquery网页可见区域宽

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  10. 关于FloatingActionButton

    由于FloatingActionButton本质上是ImageView,跟ImageView相关的就不介绍,这里重点介绍新加的几个属性. app:fabSize:FloatingActionButto ...