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']

Int*Array

构造函数如下(都是一样的),因此不能直接传入字符串:

  1. Int8Array(bufferOrArrayOrLength,byteOffset,length)

使用Buffer可以直接将字符串转为HEX,使用Int8Array可以直接转换为标准byte(-128 ~ 127)数组:

  1. // hex: 41 ~ 5A
  2. var UPPER = new Int8Array(new Buffer('ABCDEFGHIJKLMNOPQRSTUVWXYZ'));
  3. // hex: 61 ~ 7A
  4. var lower = new Int8Array(new Buffer('abcdefghijklmnopqrstuvwxyz0123456789'));
  5. // hex: 30 ~ 39
  6. var number = new Int8Array(new Buffer('0123456789'));

如果使用Uint8Array,则转换为无符号的byte(0 ~ 255)数组:

  1. var u = new Uint8Array(new Buffer('123456'));

使用的第三模块


forge - npm install node-forge --save

froge Buffer

使用forge,加解密byte数据都需要使用forge.util.ByteStringBuffer
可以通过方法forge.util.createBuffer()来创建一个新的Buffer。

  1. // put, get
  2. util.ByteStringBuffer.prototype.putByte = function(b)
  3. util.ByteStringBuffer.prototype.getByte = function()
  4. ...
  5. util.ByteStringBuffer.prototype.at = function(i)

Buffer内部有两个游标,read cursor和write cursor,只用put和get均会使游标前进,使用.at(i)可以不影响游标而直接获取相应的值。

rsa

生成KeyPair:

  1. var rsa = forge.pki.rsa;
  2. // generate an RSA key pair synchronously
  3. var keypair = rsa.generateKeyPair({bits: 2048, e: 0x10001});
  4. // generate an RSA key pair asynchronously (uses web workers if available)
  5. // use workers: -1 to run a fast core estimator to optimize # of workers
  6. rsa.generateKeyPair({bits: 2048, workers: 2}, function(err, keypair) {
  7. // keypair.privateKey, keypair.publicKey
  8. });

使用

  1. // encrypt data with a public key using RSAES-OAEP/SHA-256/MGF1-SHA-1
  2. // compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
  3. var encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', {
  4. md: forge.md.sha256.create(),
  5. mgf1: {
  6. md: forge.md.sha1.create()
  7. }
  8. });
  9. // decrypt data with a private key using RSAES-OAEP/SHA-256/MGF1-SHA-1
  10. // compatible with Java's RSA/ECB/OAEPWithSHA-256AndMGF1Padding
  11. var decrypted = privateKey.decrypt(encrypted, 'RSA-OAEP', {
  12. md: forge.md.sha256.create(),
  13. mgf1: {
  14. md: forge.md.sha1.create()
  15. }
  16. });

通过已经生成的key(asn1格式)来生成Key对象

  1. // public key
  2. var key = forge.asn1.fromDer(pubKey);
  3. var publicKey = forge.pki.publicKeyFromAsn1(key);
  4. // private key
  5. var key = forge.asn1.fromDer(priKey);
  6. var privateKey = forge.pki.privateKeyFromAsn1(key);

生成Key对象后解密

  1. /**
  2. * @param ed the encrypted data to decrypt in as a byte string.
  3. * @param key the RSA key to use.
  4. * @param pub true for a public key operation, false for private.
  5. * @param ml the message length, if known, false to disable padding.
  6. *
  7. * @return the decrypted message as a byte string.
  8. */
  9. pki.rsa.decrypt = function(ed, key, pub, ml)

解密后的字符串实际上是

  1. util.ByteStringBuffer.prototype.getBytes = function() {...}

aes

aes通过forge.cipher.createCipher('AES-ECB', key)来创建cipher使用(JAVA中AES对应的即是AES-ECB)。

  1. // decrypt aes, aesKey[ByteStringBuffer]
  2. var aesCipher = forge.cipher.createDecipher('AES-ECB', aesKey);
  3. aesCipher.start();
  4. aesCipher.update(encryptedData);
  5. if (!aesCipher.finish()) {
  6. throw new Error('decrypt error');
  7. }
  8. var decryptData = aesCipher.output;

md5

  1. // verify md5
  2. var md = forge.md.md5.create();
  3. md.update(decryptData);
  4. var mdToVerify = md.digest();

感谢: http://www.jianshu.com/p/85f152944527

node 加密音频文件 和 解密音频文件的更多相关文章

  1. iOS从零开始学习直播之音频1.播放本地音频文件

      现在直播越来越火,俨然已经成为了下一个红海.作为一个资深码农(我只喜欢这样称呼自己,不喜欢别人这样称呼我),我必须赶上时代的潮流,开始研究视频直播.发现视屏直播类的文章上来就讲拉流.推流.采集.美 ...

  2. C#将科大讯飞语音合成文件转换为MULAW音频格式

    任务描述:通过科大讯飞语音合成组件在线完成文本转语音的合成,然后再转换为电话系统IVR要求的音频格式: wave mu-law 16位 8kHZ 64kbps. 完成步骤: 首先,我们要先通过科大讯飞 ...

  3. Code笔记之:对使用zend加密后的php文件进行解密

    对使用zend加密后的php文件进行解密 使用zend加密后的php文件用notpad++打开会出现类似的乱码 下面使用解密工具进行解密 http://pan.baidu.com/s/1i3n4ysX ...

  4. javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  5. ref:使用Dezender对zend加密后的php文件进行解密

    ref:http://www.cnblogs.com/88223100/ 使用Dezender对zend加密后的php文件进行解密   在开发中需要修改一些php文件,部分是通过zend加密的,记事本 ...

  6. php简单混淆类加密文件如何解密?

    最近在整理单位购买的源码时,发现源码里好多文件都混淆加密了.虽然不解密也不影响使用,但是心里总觉得有些别扭,便试着将加密的文件解密. 首先,百度了一下,看网上是否有现成的混淆类解密工具,搜到了一个ht ...

  7. 如何用FFmpeg API采集摄像头视频和麦克风音频,并实现录制文件的功能

    之前一直用Directshow技术采集摄像头数据,但是觉得涉及的细节比较多,要开发者比较了解Directshow的框架知识,学习起来有一点点难度.最近发现很多人问怎么用FFmpeg采集摄像头图像,事实 ...

  8. node.js 使用 UglifyJS2 高效率压缩 javascript 文件

    UglifyJS2 这个工具使用很长时间了,但之前都是在 gulp 自动构建 时用到了 UglifyJS 算法进行压缩. 最近玩了一下 UglifyJS2 ,做了一个 在线压缩javascript工具 ...

  9. 深入学习Python解析并解密PDF文件内容的方法

    前面学习了解析PDF文档,并写入文档的知识,那篇文章的名字为深入学习Python解析并读取PDF文件内容的方法. 链接如下:https://www.cnblogs.com/wj-1314/p/9429 ...

随机推荐

  1. [WC2011]最大XOR和路径 线性基

    [WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...

  2. 应用.NET控制台应用程序开发批量导入程序。

    一.最近一直在调整去年以及维护去年开发的项目,好久没有在进行个人的博客了.每天抽了一定的时间在研究一些开源的框架,Drapper 以及NHibernate以及当前比较流行的SqlSuper框架 并进行 ...

  3. 关于自动化测试框架,所需代码技能,Java篇——参数配置与读取.

    前言: 说在前边.像我这种假期不出去浪,在这里乖乖写文章研究代码的人,绝壁不是因为爱学习,而是自己不知道去哪玩好,而且也不想玩游戏,看电视剧什么的,结果就无聊到看代码了…… 至于如何解读代码,请把它当 ...

  4. JTree实现电脑资源管理器

    0.前言 最近老师布置了一项用Java写资源管理器的任务,一开始以为简单,但是实际操作起来,却发现网上的资源用起来相对生疏.在使用中,我也遇到了许多问题,虽然不能像其他博主一样,写的非常齐全,但我还是 ...

  5. PHP 用户密码加密函数password_hash

    传统的用户名和密码都采用加盐的方式存储加密信息,盐值也需要存储. 自PHP5.5.0之后,新增加了密码散列算法函数(password_hash),password_hash() 使用足够强度的单向散列 ...

  6. 自动化工具 fastmonkey

    Android Monkey 二次开发,实现高速点击的 Android Monkey 一.工具介绍: 1.本工具是testhome上 zhangzhao_lenovo开源出来的工具,源码暂时还未开源: ...

  7. 17-使用公共 Registry

    Docker Hub 是 Docker 公司维护的公共 Registry.用户可以将自己的镜像保存到 Docker Hub 免费的 repository 中.如果不希望别人访问自己的镜像,也可以购买私 ...

  8. 初试Shell脚本

    背景 临上线前测试比较努力,遇到闪退或者其他问题,会把日志包打给我,由于app内存限制,目前每次打包都是1m大小,所以有时查找问题的上下文比较吃力.同时由于日志比较多,根据关键词过滤的需求越来越重要. ...

  9. GTK 预置对话框 GtkDialog 文件/颜色/字体选取等 GtkFileSelection

    (GTK2) 文档链接 作用:打开一个预置的对话框,如文件选取对话框 GtkFileSelection 效果下图所示 ╰── GtkDialog ├── GtkAboutDialog ├── GtkC ...

  10. PytorchZerotoAll学习笔记(一)

    Pytorch的安装请参考torch的官方文档,传送门:https://pytorch.org/get-started/locally/ Numpy的复习 如果你之前没有学过Numpy的话,建议去看看 ...