Efficient Function-Hiding Functional Encryption: From Inner-Products to Orthogonality