Giter Club home page Giter Club logo

crypto-js-wasm's Introduction

originjs

slogan:originjs is origin;

origin 中文名称 => "元";你也可以理解为源或原;意义为最原始的状态;类似混沌。

originjs is origin 翻译成中文 元本是元 ;见路不走,即见因果;见相非相,即见如来;

本着不拘泥于经验教条,同时又吸收前人成熟的方法,赋能开发者。

Originjs 的理念是一套基于原生Javascript 的轻量级的JavaScript框架,用于数据、方法的处理;

多数程序员在使用前端框架的时候可能会使用vue、react、ng等,虽然他们会以轻量高效著称,但是是否如他们讲的那样只有开发者有发言权。Originjs的出现并非是替代或颠覆而是完善,也就是说无论你是使用vue或react开发的项目您都可以使用Orgingjs加入到您的项目当中;

当然Originjs 不仅仅是为了迎合市场,更迎合我们开发者; 有些相对体量较小而且多是逻辑处理的项目,boss最求的高效&迅速完成开发,这时如果您再去用vue或react还是有一些的笨重。

这个时候就需要用到originjs协助您开发。

在语法上originjs基于原生的JavaScript开发,支持原生JavaScript ES6/7/8/9...,所以您不必为语法上做过多的纠结,只需按照我们的约定方式。

OriginJS

Help developers complete tasks faster

Requirement

  • google analytics installed

Getting started

From bower

bower install cn-originjs --save

From npm

npm install cn-originjs 

How it works

(1)originAjax(a,b,c,d,e);
	//=>ajax 
	Parameters you have to pass!!!
	a:url 
	b:type(post/get/put...) 
	c:cookie save true or false 
	d:callback 
	e:params
(2)originFor
	First step :Preparation data and target DOM Node
	arr: Data to process 
	domNode: Insertion node
	The second step: Call it
	originFor(arr,domNode,function(data){
		//Your code...
	})
	The third step: insert to target DOM Node


origin.post.Ajax(); //=> ajax post 
origin.getParams() //=> return url params in object type
origin.forData();//=> for data
origin.getSource() //=> return utm_source
origin.getMedium() //=> return utm_medium
origin.getContent() //=> return utm_content
origin.getCampaign() //=> return utm_campaign
origin.getTerm() //=> return utm_term

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Licence

CSHANS.CN | CN-OriginJs

crypto-js-wasm's People

Contributors

aaron-schmidt avatar alanscut avatar asivery avatar astutejoe avatar dandv avatar elity avatar entronad avatar evanvosberg avatar fredericrous avatar gracefullight avatar hkjpotato avatar hxw avatar jokecamp avatar kechol avatar kirill-konshin avatar lizhe2004 avatar lubosd avatar paulmwatson avatar pearson-g avatar pedrouid avatar peteralfredlee avatar pkaminski avatar spencer17x avatar szepeviktor avatar thg303 avatar tqc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

crypto-js-wasm's Issues

DES.encrypt 、DES.decrypt 加解密结果不一致

DES.decrypt、DES.encrypt 方法,如果需要加密的字符和加密密钥长度不一致,就会导致解密的结果和原始字符串不一致,
运行测试用例 test/des.test.js 能复现问题
但是使用 crypto-js 没问题,
请问有什么办法解决问题吗

重新编译后加载wasm 运行报错

我使用rust 1.71.0 对现在的代码进行编译,然后使用build-rust 进行转码,然后替换原来的wasm.js 文件
在运行的时候,结果提示Imports argument must be present and must be an object
根据文档 WebAssembly.instantiate 的import 需要给值,但是wasm 并不需要外部依赖
所以想请问下编译时的参数

Is it safer than crypto-js?

i have seen the code in algo.aes.test.js
const key128 = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f'); const key192 = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f1011121314151617'); const key256 = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'); const iv = cryptoJs.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
first, since the key and iv are written in js code, everyone can watch it by console in browser just like use crypto-js。
second, the encryption algorithms are all same with crypto-js like aes,rsa and so on。
so i real doubt weather crypto-js-wasm is safer than crypto-js。

maybe the key and iv should put in wasm is safer...

`CryptoJSW.algo.MD5.create` can not use in web worker

When use CryptoJSW.algo.MD5.create in web worker, it throw the following error.

TypeError: CryptoJSW.algo.MD5.create is not a function

See the Code at replit.com.

// worker.js
import CryptoJSW from '@originjs/crypto-js-wasm'

self.onmessage = async (e) => {
  await CryptoJSW.algo.MD5.loadWasm()
  const hasher = CryptoJSW.algo.MD5.create()
  hasher.update(e.data)
  const md5 = hasher.finalize()
  const str = CryptoJSW.enc.Base64.stringify(md5)
  postMessage(str)
}
// main.js
const el = document.querySelector('#app')
const worker = new Worker(
  new URL('./worker.js', import.meta.url),
  {
    type: 'module',
  },
)

worker.onmessage = (e) => {
  el.innerText = e.data
}

worker.onerror = (e) => {
  el.innerText = e
}

worker.postMessage('hello, world')

Is chunking possible?

I've tried to encrypt a large file in chunks using AES, but I get a undefined exception (doDecrypt is undefined) when I call it like this:

   async Encrypt(file: File, password: string) {
    await CryptoJSW.loadAllWasm();
    let aesEncryptor = CryptoJSW.algo.AES.createEncryptor(CryptoJSW.SHA256(password))
    let bits = [];
    let startByte = 0;
    let endByte = 0;
    while (startByte < file.size - 1) {
      endByte = startByte + 1000000;
      var reader = new FileReader();

      // If we use onloadend, we need to check the readyState.
      reader.onloadend = function(evt) {
        if (evt.target.readyState == FileReader.DONE) { // DONE == 2
          const content = evt.target.result.toString();
          // Exception here
          bits.push(aesEncryptor.process(content));
        }
      };

      var blob = file.slice(startByte, endByte + 1);
      reader.readAsBinaryString(blob);
      startByte = endByte;
    }

    var encrypted = aesEncryptor.finalize();
    console.log(encrypted.toString());
  }

Is this just not supported or am I doing this wrong? (This code doesn't work yet, the result might be in the wrong order, but that doesn't matter)

Connecting the library to the postman

Is it possible to add the entire library to the repository in one file to be able to plug it remotely into postman and its pre-request script?
Or can you tell me how I can connect your library to postman?

在浏览器内使用报错

Uncaught TypeError: Cannot read properties of undefined (reading 'inflate')
pako.inflate这个库是node的,浏览器内好像无法使用

AES encryption has different result between crypto-js and crypto-js-wasm

Example code below:

await CryptoJSW.AES.loadWasm()

const block = CryptoJSW.AES.encrypt(JSON.stringify(res), encKey, {
    iv: encKey,
    mode: CryptoJSW.mode.CBC,
    padding: CryptoJSW.pad.Pkcs7,
  })
  const data = block.ciphertext.toString(CryptoJSW.enc.Hex)

After switching from crypto-js to crypto-js-wasm, the ciphertext changed.

RSA加密后呈现为Unit8Array!!转换字符串不成功

示例代码:

const rsa = new C.algo.RSA();

await rsa.loadWasm();
let encrypted = rsa.encrypt('mesage');

let enStr = String.fromCharCode.apply(null, new Uint16Array(encrypted))

转换后的结果如下:前面是encrypted,后面是enStr
image

  • 转换的 enStr 应该不属于预期的结果
  • encrypted如何才能得到字符串结果呢

用于浏览器项目 webpack 打包会报错

ERROR in ./node_modules/@originjs/crypto-js-wasm/lib/index.js 6636:17-30
Module not found: Error: Can't resolve 'fs' in '...\node_modules\@originjs\crypto-js-wasm\lib'

@originjs/crypto-js-wasm/lib/index.js 里面 initFromKeyFile 函数有

      const fs = require('fs');

      if (!fs.existsSync(path)) {
        throw new Error('Can not find the key file in path :\n' + path);
      }

      const keyContent = fs.readFileSync(path, {
        encoding: 'utf-8',
        flag: 'r'
      });

Why is using DES decryption twice slower than JS

I tried using cryptom in webworker

loading completed first, taking 20ms

import CryptoJS from  "./cryptom-js/index";
await CryptoJS.DES.loadWasm();

performing decryption operations does not result in better performance compared to JavaScript

function getDesDecryptString(encrypted, _key, _iv) {
  let key = CryptoJS.enc.Utf8.parse(_key);
  let iv = CryptoJS.enc.Utf8.parse(_iv);
  let decrypted = CryptoJS.DES.decrypt(encrypted, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7,
  });
  return decrypted.toString(CryptoJS.enc.Utf8);
}

this is my test encryption code (DES,key:'EGCNPCV1',iv:'CNPCV1EG')

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.