Tag: aes

用AirPlay 2播放AES加密影片的坑

TL; DR 如果在透过Airplay 2播放AES加密影片的时候,发现无法正确的呼叫到实作的AVAssetResourceLoaderDelegate,以至于没有正确加入授权(存取凭证)而无法下载影片播放时,只需重新读取的HLS影片来源URL scheme客制化即可。 前言 为了防止正版影片被盗用,影片在传输前就会先加密好,才传送给使用者端解密,观看。常用的保护方式如透过数位版权管理(DRM),或依据进阶加密标准(高级加密标准,AES)加密,而这篇文章就是谈谈在客户端AES解密影片时用AirPlay2投影所遇到的坑! 使用AVAssetResourceLoaderDelegate AVAssetResourceLoaderDelegate(后面简化成“ ARL委托”)是Apple的AVKit中读取到AVURLAsset资源时,通知应用程序端处理的委派模式(代理模式)。理论上,当AVKit需要您的应用程序“植入”去读取资源(影片,m3u8档案或字幕档案)时,就会去呼叫resourceLoader(_:shouldWaitForLoadingOfRequestedResource :),这时候app就可以加入读取所需的授权验证(例如:auth token),来让你的服务端能够验证您的资源读取需求,并回传你所需要的资源档案。 替换成客制化方案的流程: 读取master播放列表(master.m3u8) 让一开始读取的master.m3u8 URL方案在应用端从https cplp成cplp ( https://example.com/master.m3u8 –> cplp ://example.com/master.m3u8),而因为这个客制化的cplp URL方案,就会让ARL委托被触发,并通过resourceLoader(_:shouldWaitForLoadingOfRequestedResource :)能够被顺利的调用到,但这里只需要去获得master.m3u8档案并回传给loadingRequest即可,不需要其他的处理。 注意:若不确定原始先使用的协议会是 http 或 https 的话,可以通过“加入前缀”的方式去改成客制化sheme,例如在scheme前面加上 my ,则 http 就会变成 myhttp ,而 https 就会变成 myhttps 。如此一来,想要还原原本的方案,只需要可移除的前缀即可。 读取index播放列表(index.m3u8) 因为master.m3u8的URL被窜改成客制化的URL方案,所以一来根据HLS(http live stream)的规则,master中的index.m3u8连结也就会自动变成cplp://example.com/index .m3u8,并且成功让ARL代表也被呼叫。 但因为密钥将链接放置在index.m3u8的缘故,则​​需要更进一步的将成为“#EXT-X-KEY:METHOD = AES-128,URI =” https://example.com/key “”给换成“#EXT-X-KEY:METHOD = AES-128,URI =” ckey ://example.com/key””(注意这里的自定义方案“ […]

我怎样才能解密在iOS的XML文件与AES / CBC / PKCS5Padding标准,在Android的文件已被解密,所有的关键像盐,IV

private static Cipher getCipher(int mode) throws Exception { Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); //a random Init. Vector. just for testing byte[] iv = "e675f725e675f725".getBytes("UTF-8"); c.init(mode, generateKey(), new IvParameterSpec(iv)); return c; } private static String Decrypt(String encrypted) throws Exception { byte[] decodedValue = new Base64().decode(encrypted.getBytes("UTF-8")); // new BASE64Decoder().decodeBuffer(encrypted); Cipher c = getCipher(Cipher.DECRYPT_MODE); byte[] decValue = c.doFinal(decodedValue); return […]

AVPlayer在线模式下停止播放AESencryption离线HLSvideo

我写了一个代码来下载HLSvideo并以离线模式播放。 此代码适用于编码的video。 现在我有一个AESencryption的video,我们正在为它定制encryption密钥。 下载AESencryption的HLSvideo后,我使用下面给出的代码来提供解密video的密钥。 – (BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest { NSString *scheme = loadingRequest.request.URL.scheme; if ([scheme isEqualToString:@"ckey"]) { NSString *request = loadingRequest.request.URL.host; NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:request]; if (data) { [loadingRequest.dataRequest respondWithData:data]; [loadingRequest finishLoading]; } else { // Data loading fail } } return NO; } 我截获一个密钥的请求,并传递存储在UserDefaults中的密钥进行解密。 当我的设备的wifi或数据连接closures时,使用自定义密钥的AESencryptionHLSvideo播放效果良好。 如果我在启用设备的wifi或数据连接时开始播放此video,或者在播放video时启用设备的wifi或数据连接, video立即停止播放,没有任何错误,从不再播放。 我检查了playerItem的accessLog和errorLog,但没有发现任何有用的东西。 在下载HLS内容后提供自定义URL密钥我正在更新.m3u8文件的内容 URI = […]

如何对swift XCODE上的string进行AES 128encryption并将其作为POST发送给服务器?

如何在swift XCODE上对string进行AES 128encryption,并将其作为POST发送到服务器?…我是XCODE的新手,正在学习对string数据进行encryption并希望发送到HTTP服务器。 这是一个基本的iOS应用程序发送设备的经度和纬度。

CryptoJs Encryption在android中不起作用

我必须在Android应用程序中实现encryption。 网页开发人员正在使用CryptoJs库。 意味着encryptionalgorithm是AES256encryption。 iOS和Android平台都给出了不同的string,iOS上的一个接受了web.Itstring应该是一样的。 我正在使用下面的代码片段(有2个不同的function): private void newEnc() { String secret = "LSC@SD2017@ps"; String cipherText = "{\"device_type\":\"iOS\",\"email\" : \"jhon@gmail.com\",\"device_id\" : \"14105DA4-CEE5-431E-96A2-2331CDA7F062\",\"password\" : \"123456\",\"device_token\" : \"B44777563552882EC3139A0317E401B55D6FC699D0AC3D279F392927CAF9B566\"}"; KeyGenerator kgen = null; try { kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(secret.getBytes("UTF8")); kgen.init(256, sr); SecretKey skey = kgen.generateKey(); Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec skeySpec = new SecretKeySpec(skey.getEncoded(), "AES"); […]

如何在iOS中使用AES128encryption的Openssl工具解密数据

我有很多代码片断,用AES128encryption数据(如果你提供你的工作实现,我将非常感谢)例如这个: – (NSData*)AES128EncryptWithKey:(NSString*)key { // 'key' should be 16 bytes for AES128, will be null-padded otherwise char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused) bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; //See the doc: For block ciphers, the output size […]

AES / cbc / pkcs5padding encription IOS

我在android中使用AESalgorithm进行encryption。 下面的代码我们用于encryption。 String seed = "somekey"; Key key = null; // 128 bit key byte[] byteKey = seed.substring(0, 16).getBytes("UTF-8"); key = new SecretKeySpec(byteKey, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec( new byte[16])); byte[] encValue = cipher.doFinal(pValue.getBytes()); encryptedText = new BASE64Encoder().encode(encValue); 任何人都可以提供上述IOS的逻辑。 提前感谢。

如何发送NSData作为密钥和四CCCrypt

我需要AES128encryption一个16字节的数据块使用一个密钥和一个IV到16字节的AES块。 我见过的每个CCCrypt示例都带有(NSString *)键和IV。 我的密钥和IV是NSData 16个字节。 我已经将NSData转换为hexstring,但结果是不正确的。 当我这样做时,我得到一个32字节的AES块。 所以我的问题是,我必须做什么来获得NSData作为一个const void *读入CCCrypt? – (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv theData:(NSData *)theData { char keyPtr[kCCKeySizeAES128 + 1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; bzero(ivPtr, sizeof(ivPtr)); if (iv) { [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; } NSUInteger dataLength = [theData length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; […]

AES128在iOS 7上截断解密的文本,在iOS 8上没有问题

使用ECB模式(这是玩具encryption)和PKCS7填充使用AES128encryption的密文,以下代码块导致在iOS 8下恢复完整的明文。 在iOS 7下运行相同的代码块会导致正确的明文,但会被截断。 为什么是这样? #import "NSData+AESCrypt.h" // <– a category with the below function #import <CommonCrypto/CommonCryptor.h> – (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv { char keyPtr[kCCKeySizeAES128 + 1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCBlockSizeAES128 + 1]; bzero(ivPtr, sizeof(ivPtr)); if (iv) { [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; } NSUInteger dataLength = [self length]; size_t […]

PHP服务器和iOS上的AES Rijndael生成有时不同的密码

我使用Jim Dovey的NSData + AESCrypt类和Michael Sedlaczek的NSString + AESCrypt(2011-02-22)。 而在PHP上,我有一个简单的脚本: <?php $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $key = '01234567890123456789012345678901'; $plaintext = "myworda"; $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_ECB); $base64encoded_ciphertext = base64_encode($ciphertext); echo "ciphertext: ".$base64encoded_ciphertext."<br/>"; ?> 在ObjC: NSString *key = @"01234567890123456789012345678901"; NSString *plaintext = [@"+l56Ia4yyK19D2x2+oCXuw==" AES256DecryptWithKey: key]; NSLog(@"plaintext: %@", plaintext); 我在PHP中更改variables$ plaintext,运行脚本并将输出密码复制并粘贴到Objective-c以解密。 和: “myword”给我“+ l56Ia4yyK19D2x2 […]