由于项目需要SNMPV3支持,但手中没有现成的V3库,所以需要重新开发,现在将对v3开发说一下思路性的东西
在开发过程中,觉得包的结构不是重点,比较简单,可以参考
http://www.comsoc.org/livepubs/surveys/public/4q98issue/stallings.html (SNMPv3 A Security Enhancement for SNMP)
重点在加密上,snmpv3请参考
http://www.ietf.org/rfc/rfc2271.txt --- http://www.ietf.org/rfc/rfc2274.txt
我硬是看了rfc2天,才揣摩出来,由于是公司代码,不方便公布出来,说说snmpv3加密的思路
snmpv3 分为 noAuthNoPriv, authNoPriv(), authPriv
noAuthNoPriv 为不验证,其结构就是snmpv3的原始结构,其中authParameters 为12个0,authParameters必须为12位,怎么才能得到这12位,下面将阐述一下
这里只是说一下 authNoPriv 模式,这个模式理解了,其他都好理解了
authNoPriv 分为 hmac -md5 -96 和 hmac – sha-96 加密方式,
关于 md5 可以参考 http://www.ietf.org/rfc/rfc1321.txt ,网页下面有c语言的demo
hmac -md5 -96 是在 md5基础上进行hash运算的算法,可以参考
http://www.ietf.org/rfc/rfc2104.txt,网页下面有c语言的demo
这两个文档,就可以写出一个下面的函数。


其中输入,text为你准备发送的内容,这个准备发送的内容为当你authNoPriv选项的内容,但 authParameters 为12个0,一定要注意。
Key 为用auth密码和engineID 加密后产生的key,下面将介绍怎么产生的
Digest 就为输出的authParameters 应该为多少的值,前面说了的必须为12字节,那么用md5码加密后为16字节怎么办,取前面12个就可以了
得到了 authParameters 这个价值后 ,把原来 authParameters 替换后,发送 ,就OK了
最后说一下KEY怎么产生 ,请参考
http://www.ietf.org/rfc/rfc2274.txt ,下面有个C的Demo ,如MD5




password 为你设置的AuthorPass , engineID 就是你收到的EngineID了。
注意:RFC上的demo有点小失误,就是
memcpy(password_buf+engineLength, key, 16);
原来是上面这行,通过我郁闷的测试发现
应该为 memcpy(password_buf+engineLength+16, key, 16); 一定注意哈
大约就是这样了,关于SHA加密,和MD5思路是一样了,
authPriv 模式加密只有DES ,就是把PDU部分用DES加密,具体可以参考上面所提到的文档
希望对大家有所帮助。