/*
String RequestStr3 = @"01 00 00 9E EB B2 E8 D9 1E 52 10 03 FB E1 52 39 27 58 93 F0 01 0E 33 34 38 30 62 33 34 32 61 30 61 33 02 12 56 BE 23 D1 61 13 7F E5 95 21 CB 44 B9 32 D4 49 04 06 C0 A8 08 05 20 07 68 65 6C 6C 6F 1E 1A 41 30 2D 36 33 2D 39 31 2D 38 42 2D 30 39 2D 35 30 3A 48 44 41 50 30 35 1F 13 33 34 2D 38 30 2D 42 33 2D 34 32 2D 41 30 2D 41 33 3D 06 00 00 00 13 4D 18 43 4F 4E 4E 45 43 54 20 31 31 4D 62 70 73 20 38 30 32 2E 31 31 62 50 12 B8 4B 87 5E 53 77 2C FA 90 16 E3 B5 5F 4E CA FD ";
*/
var requestStr = RequestStr3;
var responseStr = @"02-00-00-2C-57-CE-42-DB-EB-9F-DA-5D-B3-E5-DB-D0-9E-75-92-BA-1B-06-00-98-96-7F-50-12-D1-B1-36-29-F5-7D-1C-65-CB-BC-DA-57-DE-49-E7-3C";
var responseArr = responseStr.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var responseBytes = new List<byte>();
foreach (var item in responseArr)
{
responseBytes.Add(byte.Parse(item, NumberStyles.HexNumber));
}
var responsePaket = nRadiusPaket.Parser(responseBytes.ToArray()); var request = GetRequestPaket(); var autherRaw = new List<byte>();
autherRaw.Add();
autherRaw.Add();
autherRaw.AddRange(new byte[] { , 0x2C });
autherRaw.AddRange(request.Authenticator);
foreach (var a in responsePaket.Attributes)
{
autherRaw.AddRange(a.Paket);
}
autherRaw.AddRange(Encoding.ASCII.GetBytes("")); var md5 = new MD5CryptoServiceProvider();
var authernticatorMd5 = md5.ComputeHash(autherRaw.ToArray()); Console.WriteLine("MD5:" + BitConverter.ToString(authernticatorMd5));
Console.WriteLine("TAG:" + BitConverter.ToString(responsePaket.Authenticator)); var MAuthRaw = new List<byte>();
MAuthRaw.Add();
MAuthRaw.Add();
MAuthRaw.AddRange(new byte[] { , 0x2C });
MAuthRaw.AddRange(request.Authenticator);
foreach (var a in responsePaket.Attributes)
{
if (a.Paket[] == )
{ MAuthRaw.AddRange(a.Paket.Take());
for (int i = ; i < ; i++)
{
MAuthRaw.Add();
}
}
else
{
MAuthRaw.AddRange(a.Paket);
}
} var hmacMD5 = HMACMD5.Create("HMACMD5"); hmacMD5.Key = Encoding.ASCII.GetBytes("");
var hmacBytes= hmacMD5.ComputeHash(MAuthRaw.ToArray());
Console.WriteLine("HMAC-TAG:D1-B1-36-29-F5-7D-1C-65-CB-BC-DA-57-DE-49-E7-3C");
Console.WriteLine("HMAC-Cup:" + BitConverter.ToString(hmacBytes));

1.Message-Authenticator计算时
参考文档:

      Message-Authenticator = HMAC-MD5 (Type, Identifier, Length,
Request Authenticator, Attributes) When the checksum is calculated the signature string should be
considered to be sixteen octets of zero.
这里的Type,应该是Response paket的 Code, Attributes,由于包括了Message-Authenticator Attribute,
在计算时间时,填充16个字节的0来计算,即 byte[]{80,18,00,00...,00}
另外HMAC-MD5(Type, Identifier, Length, Request Authenticator, Attributes)表示
HMAC-MD5(Type + Identifier + Length +Request Authenticator + Attributes) Access-Accept packet中type= byte[]{02},Attributes 是完整包,如 Message-Authenticator Attribute =byte[]{80,18,x,x,x....x},

2.Response Authernticator 的计算,需要先完成上面的Message-Authernticator 计算

3.User-Password字段的计算与解密
     /// <summary>
///
/// </summary>
/// <param name="pwdAttrPaket">User-Password段,包括type跟length+x...</param>
/// <param name="SharedSecret"></param>
/// <param name="RequestAuthenticator"></param>
/// <returns></returns>
public static byte[] EncodePAPPwd(String pwdStr, string SharedSecret, byte[] RequestAuthenticator)
{ var pwdBytes = Encoding.Default.GetBytes(pwdStr);
var dataLen = pwdBytes.Length / ;
var r = pwdBytes.Length % ;
if (r != )
{
dataLen++;
} var pArr=new byte[dataLen * ];
Array.Copy(pwdBytes, pArr, pwdBytes.Length); //补0字节处理
if (r != )
{
for (int i = pwdBytes.Length; i < pArr.Length; i++)
{
pArr[i] = ;
}
} var bi = new byte[];
var ciArr = new byte[pArr.Length]; var shareSecretBytes = Encoding.Default.GetBytes(SharedSecret); var tmp = new byte[shareSecretBytes.Length + ];
Array.Copy(shareSecretBytes, tmp, shareSecretBytes.Length);
Array.Copy(RequestAuthenticator, , tmp, shareSecretBytes.Length, );
Array.Copy(MD5.Create("MD5").ComputeHash(tmp), bi, ); for (int i = ; i < dataLen; i++)
{
for (int bIndex = ; bIndex < ; bIndex++)
{
ciArr[i * + bIndex] =(byte)( bi[bIndex] ^ pArr[i * + bIndex]);
} Array.Copy(ciArr, i * , tmp, shareSecretBytes.Length, );
Array.Copy(MD5.Create("MD5").ComputeHash(tmp), bi, ); }
return ciArr;
}
/// <summary>
///
/// </summary>
/// <param name="pwdAttrPaket">User-Password段,包括type跟length+x...</param>
/// <param name="SharedSecret"></param>
/// <param name="RequestAuthenticator"></param>
/// <returns></returns>
public static byte[] DecodePAPPwd(byte[] pwdAttrPaket, string SharedSecret, byte[] RequestAuthenticator)
{
var chunksCount = (pwdAttrPaket.Length - ) / ;
var biArr = new byte[pwdAttrPaket.Length - ]; var shareSecretBytes= Encoding.Default.GetBytes(SharedSecret);
var tmp = new byte[shareSecretBytes.Length + ];
Array.Copy(shareSecretBytes, tmp, shareSecretBytes.Length);
Array.Copy(RequestAuthenticator, , tmp, shareSecretBytes.Length, );
Array.Copy( MD5.Create("MD5").ComputeHash(tmp),biArr,); for (int i = ; i < chunksCount; i++)
{ Array.Copy(pwdAttrPaket, ((i - ) * ) + , tmp, shareSecretBytes.Length, );
Array.Copy(MD5.Create("MD5").ComputeHash(tmp), , biArr, i * , );
} for (int i = ; i < biArr.Length; i++)
{
biArr[i] =(byte)( biArr[i] ^ pwdAttrPaket[ + i]);
} return biArr;
}
 

Radius 中 与Response Authernticator 与 Message-Authenticator的计算的更多相关文章

  1. python中各个response使用

    Python django中我们经常用的response有django中的 JsonResponse, HttpResponse,还有DRF中的Response 在使用的时候,经常会不知道如何什么时候 ...

  2. Django中的response

    render_to_response render_to_response('index.html', locals(),context_instance=RequestContext(request ...

  3. 脚本编程中的test、bash调试、变量计算、参数

    脚本编程中的test.bash调试.变量计算.参数 1.文件测试 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试路径是否为目录 -r FILE:测试当前 ...

  4. Java中浮点型数据Float和Double进行精确计算的问题

    Java中浮点型数据Float和Double进行精确计算的问题 来源  https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失     ...

  5. 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  6. 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理。距离远时图片放大,距离近时图片缩小

    查看本章节 查看作业目录 需求说明: 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理.距离远时图片放大,距离近 ...

  7. 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...

  8. springmvc中使用response的out.print问题

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws E ...

  9. Web API中的消息处理程序(Message Handler)

    一.消息处理程序的概念 信息处理程序(Message Handler)接收HTTP请求并返回一个HTTP响应的类.Message Handler继承 HttpMessageHandler 类. 通常, ...

随机推荐

  1. 前端-CSS-2-选择器

    基本选择器 首先来说一下,什么是选择器.在一个HTML页面中会有很多很多的元素,不同的元素可能会有不同的样式, 某些元素又需要设置相同的样式,选择器就是用来从HTML页面中查找特定元素的,找到元素之后 ...

  2. vue - process.env 定义

    1.官方解释:process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程.作为一个对象,它对于 Node.js 应用程序始终是可用的,故无需使用 requir ...

  3. 主流JS库一览

    主流JS库一览 标签: prototypedojomootoolsprototypejsjqueryjavascript 2009-10-14 22:52 19936人阅读 评论(2) 收藏 举报   ...

  4. 关于struts2输出excel表

    web.xml: <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com ...

  5. JavaScript实现AOP(面向切面编程,装饰者模式)

    什么是AOP? AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计.安全控制.异常处理等.把这些功能抽离出来之后, 再通过“动态织入 ...

  6. express + mongodb 搭建一个简易网站(二)

    express + mongodb 搭建一个简易网站 (二) 在搭建网站(一)中,实现了简单的路由功能,这离一个完整的网站还差的有点远,继续撸代码吧. 1.首先在根目录下新建一个views文件夹,用来 ...

  7. 大型运输行业实战_day02_2_数据模型建立

    1.模型分析 1.基本必备字段 id   state  type   createTime   updateTime 2.车票  :   车次   开始车站   到达车站   出发时间    票价   ...

  8. 如何获取某个网站的favicon.ico

    http://moco.imooc.com/player/report.html 今天看到这个网站上,左侧的小图片挺好看的,想弄下来,检查源码,也没有看到 <head> <meta  ...

  9. SpringCloud 简单理解

    0.SpringCloud,微服务架构.包括 服务发现(Eureka),断路器(Hystrix),服务网关(Zuul),客户端负载均衡(Ribbon).服务跟踪(Sleuth).消息总线(Bus).消 ...

  10. 中文路径读取乱码,json乱码

    strPath = 'E:\新建文件夹' #含有中文的路径,使用unicode函数转换. strPath = unicode(strPath , "utf8") 参考:http:/ ...