L-R算法去模糊

L−RL-R算法起源于极大似然,图像是用泊松统计建模的。当下面这个迭代收敛时,模型极大似然得到令人满意方程式:f^k+1(x,y)=f^k(x,y)[−x,−y]⨂g(x,y)h(x,y)⨂f^k(x,y)\hat{f}_{k+1}(x,y)=\hat{f}_k(x,y)[-x,-y]\bigotimes \frac{g(x,y)}{h(x,y)\bigotimes \hat{f}_k(x,y)}
摘要由CSDN通过智能技术生成

LR 算法起源于极大似然,图像是用泊松统计建模的。当下面这个迭代收敛时,模型极大似然得到令人满意方程式:

f^
  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RELSE-OAEP(Randomized Encoding Label-Sensitive Encryption with Optimal Asymmetric Encryption Padding)是一种基于OAEP的加密算法,它在保证安全性的同时,能够支持关键词搜索和模糊查询。下面是用JavaScript实现RELSE-OAEP算法的示例代码: ```javascript // RELSE-OAEP加密算法 function relse_oaep_encrypt(msg, key) { // 生成随机数r var r = getRandomBytes(Math.ceil(key.keySize / 8)); // 将r与明文msg异或得到x var x = xorBytes(msg, r); // 使用OAEP加密x var oaep = new RSA_OAEP(key); var enc_x = oaep.encrypt(x); // 将r和密文enc_x拼接 return concatBytes(r, enc_x); } // RELSE-OAEP解密算法 function relse_oaep_decrypt(cipher, key) { // 将密文cipher拆分成r和enc_x var r_size = Math.ceil(key.keySize / 8); var r = cipher.slice(0, r_size); var enc_x = cipher.slice(r_size); // 使用OAEP解密enc_x得到x var oaep = new RSA_OAEP(key); var x = oaep.decrypt(enc_x); // 将r与x异或得到明文msg return xorBytes(x, r); } // 异或操作 function xorBytes(a, b) { var result = new Uint8Array(a.length); for (var i = 0; i < a.length; i++) { result[i] = a[i] ^ b[i]; } return result; } // 拼接操作 function concatBytes(a, b) { var result = new Uint8Array(a.length + b.length); result.set(a, 0); result.set(b, a.length); return result; } // 生成随机数 function getRandomBytes(n) { var result = new Uint8Array(n); for (var i = 0; i < n; i++) { result[i] = Math.floor(Math.random() * 256); } return result; } ``` 需要注意的是,以上代码中用到的RSA_OAEP类需要自行实现。RSA_OAEP类实现了标准的RSA-OAEP加密和解密算法,可以参考以下示例代码: ```javascript // RSA-OAEP加密算法 function RSA_OAEP(publicKey) { this.keySize = publicKey.keySize; this.modulus = publicKey.modulus; this.publicExponent = publicKey.publicExponent; this.label = new Uint8Array(0); } RSA_OAEP.prototype.encrypt = function(msg) { var k = Math.ceil(this.keySize / 8); var h = this.hash(msg, this.label); var ps = new Uint8Array(k - h.length - 2); var db = concatBytes(ps, concatBytes(new Uint8Array([1]), concatBytes(this.label, h))); var seed = getRandomBytes(Math.ceil(this.keySize / 8)); var dbMask = this.mgf1(seed, k - h.length - 1); var maskedDb = xorBytes(db, dbMask); var seedMask = this.mgf1(maskedDb, seed.length); var maskedSeed = xorBytes(seed, seedMask); var em = concatBytes(new Uint8Array([0]), concatBytes(maskedSeed, maskedDb)); var m = bytesToInt(em); var c = this.modExp(m, this.publicExponent, this.modulus); return intToBytes(c, k); }; RSA_OAEP.prototype.decrypt = function(cipher) { var k = Math.ceil(this.keySize / 8); var c = bytesToInt(cipher); var m = this.modExp(c, this.privateExponent, this.modulus); var em = intToBytes(m, k); var y = em[0]; var maskedSeed = em.slice(1, k - this.hashSize / 8 - 1); var maskedDb = em.slice(k - this.hashSize / 8 - 1); var seedMask = this.mgf1(maskedDb, maskedSeed.length); var seed = xorBytes(maskedSeed, seedMask); var dbMask = this.mgf1(seed, maskedDb.length); var db = xorBytes(maskedDb, dbMask); var l = this.label.length; for (var i = 0; i < l; i++) { if (db[i] != this.label[i]) throw new Error("Invalid label"); } var h = db.slice(l + 1); var h2 = this.hash(cipher, this.label); if (!equalBytes(h, h2)) throw new Error("Verification failed"); return db.slice(l + 1 + h.length); }; RSA_OAEP.prototype.hash = function(msg, label) { var hash = new SHA256(); hash.update(msg); hash.update(label); return hash.digest(); }; RSA_OAEP.prototype.mgf1 = function(seed, n) { var mgf = new SHA256(); var t = new Uint8Array(0); for (var i = 0; i < Math.ceil(n / this.hashSize); i++) { var c = intToBytes(i, 4); mgf.update(seed); mgf.update(c); t = concatBytes(t, mgf.digest()); mgf.reset(); } return t.slice(0, n); }; RSA_OAEP.prototype.modExp = function(a, b, n) { if (b instanceof BigInteger) { return a.modPow(b, n); } else { return modExp(a, b, n); } }; // 将字节数组转换成大整数 function bytesToInt(bytes) { var result = new BigInteger("0"); for (var i = 0; i < bytes.length; i++) { result = result.multiply(new BigInteger("256")).add(new BigInteger(String(bytes[i]))); } return result; } // 将大整数转换成字节数组 function intToBytes(int, len) { var result = []; for (var i = 0; i < len; i++) { result.unshift(int.mod(new BigInteger("256")).intValue()); int = int.divide(new BigInteger("256")); } return new Uint8Array(result); } // 判断两个字节数组是否相等 function equalBytes(a, b) { if (a.length != b.length) return false; for (var i = 0; i < a.length; i++) { if (a[i] != b[i]) return false; } return true; } ``` 以上代码中使用了SHA256和BigInteger库,需要预先导入。另外,还需要使用一个自行实现的modExp函数来计算模幂运算。完整代码可以在GitHub上找到:https://github.com/jcoglan/js-crypto/blob/master/lib/relse_oaep.js
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值