PAP认证方式原理和实现
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认证方式原理和实现的更多相关文章
- Git认证方式https和ssh的原理及比较
常见的代码托管平台GitHub.GitLab和BitBucket等,基本都会使用Git作为版本控制工具.平台一般都提供两种认证方式https和ssh.了解该过程能够更加自由的配置和使用,本文就来简单聊 ...
- oracle 认证方式
Oracle登录的时候有两种认证方式,一种是“操作系统认证”,一种是“口令文件认证”.1.当采取操作系统认证的时候,在本地用任何用户都可以以sysdba登陆:(默认方式)2.当采取口令文件认证的时候, ...
- 比RBAC更好的权限认证方式(Auth类认证)
Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...
- Java 实现 SSH 协议的客户端登录认证方式--转载
背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...
- 阿里云API网关(11)API的三种安全认证方式
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- oracle登陆认证方式
转自:http://blog.itpub.net/14359/viewspace-683064/ 案例: 1,发现此时操作系统认证不成功: C:\Users\Administrator.WIN-201 ...
- OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...
- thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)
thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证) Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比 ...
- thinkphp 比RBAC更好的权限认证方式(Auth类认证)
Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 . RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了, ...
随机推荐
- transient关键字的作用
代码如下: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutpu ...
- 如何把select默认的小三角替换成自己的图片
不同的浏览器默认的select的选项图标是不同的,例如: 在chrome中,是这样的: 未点击时 点击时 在Firefox中是这样的: 未点击时 点击时 在IE9中是这样的: 未点击时 ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- [LeetCode] Fizz Buzz 嘶嘶嗡嗡
Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- ACM模板(持续补完)
1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...
- Python小白的发展之路之Python基础(二)
列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表.元组操作 (1)列表 列表是可变的(mutable)--可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不 ...
- 从PHP底层源码去深入理解数组,并用C模拟PHP关联数组(原创)
PHP是一门入门容易,使用范围广泛的语言,以其灵活性以及web后端开发被很多人熟知,也被很多人戏称“PHP是世界上最好的语言”.本人是一名“忠实”的PHPer,相信用过PHP的程序员都会体会到PHP数 ...
- jquery网页可见区域宽
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- 关于FloatingActionButton
由于FloatingActionButton本质上是ImageView,跟ImageView相关的就不介绍,这里重点介绍新加的几个属性. app:fabSize:FloatingActionButto ...