node 加密音频文件 和 解密音频文件
fs.readFile(
'./downsuccess/'
+name+
''
, {flag:
'r+'
, encoding:
''
},
function
(err, data) {
console.log(
'读取中'
)
if
(err) {
return
;
}
let b =
new
Buffer(data);
let c = b.toString(
'hex'
);
let cipherBuffer = _this.cipher(data);
fs.writeFile(
'./downsuccess/'
+name+
''
,cipherBuffer,[],
function
(){
console.log(`${name}加密完成`);
_this.downAll(_this.downList,_this.downCall)
})
});
export
function
cipher (buf) {
var
encrypted =
""
;
var
cip = crypto.createCipher(
'rc4'
,
'密匙'
);
encrypted += cip.update(buf,
'hex'
,
'hex'
);
encrypted += cip.final(
'hex'
);
return
encrypted
};
Node.js加解密

无论加密解密、字符转换,都需要使用byte,而node对byte的支持不如其他语言(如c/java,可以直接使用byte[]
)方便快捷,但是也有模块对byte提供支持。
node对byte处理的支持
Buffer
Buffer支持很多格式转换(Ascii, urf8, usc2, utf16le, base64, binary, hex),传入字符串可以直接进行格式转换:
new Buffer(size); // with size
new Buffer(array) // with array
new Buffer(str[, encoding]) // with string[, encoding = 'utf8']
- write
Buffer写可以直接使用[index]
来写入,也可以使用方法.write
buf.write(string[, offset][, length][, encoding])
buf.writeIntLE(value, offset, byteLength[, noAssert])
... - read
Buffer读可以直接使用[index]
来读取,也可以使用方法.read
buf.readUInt8(offset[, noAssert])
buf.readInt8(offset[, noAssert])
...
Int*Array
构造函数如下(都是一样的),因此不能直接传入字符串:
Int8Array(bufferOrArrayOrLength,byteOffset,length)
使用Buffer可以直接将字符串转为HEX,使用Int8Array可以直接转换为标准byte(-128 ~ 127)数组:
// hex: 41 ~ 5A
var UPPER = new Int8Array(new Buffer('ABCDEFGHIJKLMNOPQRSTUVWXYZ'));
// hex: 61 ~ 7A
var lower = new Int8Array(new Buffer('abcdefghijklmnopqrstuvwxyz0123456789'));
// hex: 30 ~ 39
var number = new Int8Array(new Buffer('0123456789'));
如果使用Uint8Array,则转换为无符号的byte(0 ~ 255)数组:
var u = new Uint8Array(new Buffer('123456'));
使用的第三模块
forge -
npm install node-forge --save
froge Buffer
使用forge,加解密byte数据都需要使用forge.util.ByteStringBuffer
。
可以通过方法forge.util.createBuffer()
来创建一个新的Buffer。
// put, get
util.ByteStringBuffer.prototype.putByte = function(b)
util.ByteStringBuffer.prototype.getByte = function()
...
util.ByteStringBuffer.prototype.at = function(i)
Buffer内部有两个游标,read cursor和write cursor,只用put和get均会使游标前进,使用.at(i)
可以不影响游标而直接获取相应的值。
rsa
生成KeyPair:
var rsa = forge.pki.rsa;
// generate an RSA key pair synchronously
var keypair = rsa.generateKeyPair({bits: 2048, e: 0x10001});
// generate an RSA key pair asynchronously (uses web workers if available)
// use workers: -1 to run a fast core estimator to optimize # of workers
rsa.generateKeyPair({bits: 2048, workers: 2}, function(err, keypair) {
// keypair.privateKey, keypair.publicKey
});
使用
// encrypt data with a public key using RSAES-OAEP/SHA-256/MGF1-SHA-1
// compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
var encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
// decrypt data with a private key using RSAES-OAEP/SHA-256/MGF1-SHA-1
// compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
var decrypted = privateKey.decrypt(encrypted, 'RSA-OAEP', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
通过已经生成的key(asn1格式)来生成Key对象
// public key
var key = forge.asn1.fromDer(pubKey);
var publicKey = forge.pki.publicKeyFromAsn1(key);
// private key
var key = forge.asn1.fromDer(priKey);
var privateKey = forge.pki.privateKeyFromAsn1(key);
生成Key对象后解密
/**
* @param ed the encrypted data to decrypt in as a byte string.
* @param key the RSA key to use.
* @param pub true for a public key operation, false for private.
* @param ml the message length, if known, false to disable padding.
*
* @return the decrypted message as a byte string.
*/
pki.rsa.decrypt = function(ed, key, pub, ml)
解密后的字符串实际上是
util.ByteStringBuffer.prototype.getBytes = function() {...}
aes
aes通过forge.cipher.createCipher('AES-ECB', key)
来创建cipher使用(JAVA中AES
对应的即是AES-ECB
)。
// decrypt aes, aesKey[ByteStringBuffer]
var aesCipher = forge.cipher.createDecipher('AES-ECB', aesKey);
aesCipher.start();
aesCipher.update(encryptedData);
if (!aesCipher.finish()) {
throw new Error('decrypt error');
}
var decryptData = aesCipher.output;
md5
// verify md5
var md = forge.md.md5.create();
md.update(decryptData);
var mdToVerify = md.digest();
感谢: http://www.jianshu.com/p/85f152944527
node 加密音频文件 和 解密音频文件的更多相关文章
- iOS从零开始学习直播之音频1.播放本地音频文件
现在直播越来越火,俨然已经成为了下一个红海.作为一个资深码农(我只喜欢这样称呼自己,不喜欢别人这样称呼我),我必须赶上时代的潮流,开始研究视频直播.发现视屏直播类的文章上来就讲拉流.推流.采集.美 ...
- C#将科大讯飞语音合成文件转换为MULAW音频格式
任务描述:通过科大讯飞语音合成组件在线完成文本转语音的合成,然后再转换为电话系统IVR要求的音频格式: wave mu-law 16位 8kHZ 64kbps. 完成步骤: 首先,我们要先通过科大讯飞 ...
- Code笔记之:对使用zend加密后的php文件进行解密
对使用zend加密后的php文件进行解密 使用zend加密后的php文件用notpad++打开会出现类似的乱码 下面使用解密工具进行解密 http://pan.baidu.com/s/1i3n4ysX ...
- javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- ref:使用Dezender对zend加密后的php文件进行解密
ref:http://www.cnblogs.com/88223100/ 使用Dezender对zend加密后的php文件进行解密 在开发中需要修改一些php文件,部分是通过zend加密的,记事本 ...
- php简单混淆类加密文件如何解密?
最近在整理单位购买的源码时,发现源码里好多文件都混淆加密了.虽然不解密也不影响使用,但是心里总觉得有些别扭,便试着将加密的文件解密. 首先,百度了一下,看网上是否有现成的混淆类解密工具,搜到了一个ht ...
- 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能
之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度.最近发现很多人问怎么用FFmpeg采集摄像头图像,事实 ...
- node.js 使用 UglifyJS2 高效率压缩 javascript 文件
UglifyJS2 这个工具使用很长时间了,但之前都是在 gulp 自动构建 时用到了 UglifyJS 算法进行压缩. 最近玩了一下 UglifyJS2 ,做了一个 在线压缩javascript工具 ...
- 深入学习Python解析并解密PDF文件内容的方法
前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...
随机推荐
- 11 stark组件之delete按钮、filter过滤
1.构建批量删除按钮 1.admin中每个页面默认都有 2.stark之构建批量删除 3.coding {% extends 'base.html' %} {% block title %} < ...
- iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字
iOS开发-通过正则表达式判断字符串是否为纯阿拉伯数字 简述:NSString * regex_0 = @"\\d{1,}"; /*允许首位为0*/ NSString * re ...
- python之GIL(Global Interpreter Lock)
一 介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...
- JavaScript——引用类型之数组
前言 之前本菜打算在写完基本类型后写引用类型Object的,因为Object是引用类型的基础,其他的引用类型也是以Object为根本.只是关于对象的基本认识与简单操作确实可写的不多,打算之后与原型.原 ...
- 动态加载与插件系统的初步实现(二):AppDomain卸载与代理
前一篇文章简单展示了类型发现和MEF使用,本文初步进入AppDomain相关内容. CLR程序运行时会创建默认程序集容器即AppDomain,默认AppDomain不支持卸载其程序集,但CLR支持创建 ...
- Shader开发之烘焙Lightmap自发光
自己参考Build-in写了一套shader, 写完发现自发光部分在烘焙时不生效, 查阅资料发现需要在Material上设置为对应标记, 这部分功能可以像Standard Shader一样写在Shad ...
- xml解析数据信息并实现DBManager操作mysql
先前一直都是用的直接用加载驱动 然后创建连接进行操作数据 如果我的数据库换了 那么要修改的地方也比较多 不利于维护 所以就想到了将所有配置连接信息都用xml封装起来 以至于我每次都只要修改一下我的 ...
- hdfs命令大全
hdfs常用命令: 第一部分:hdfs文件系统命令 第一类:文件路径增删改查系列: hdfs dfs -mkdir dir 创建文件夹 hdfs dfs -rmr dir 删除文件夹dir hdf ...
- Java 快排 排序
一.快排的一种 ==================== public class myMain { public static void main(String[] args) { int t[] ...
- 08-matplotlib-颜色与样式
import numpy as np import matplotlib.pyplot as plt ''' 颜色: - 八种内置默认颜色, 缩写 b :blue g :green r :red c ...